void UpdateEscortAI(const uint32 uiDiff) override { if (uiPhaseTimer <= uiDiff) { switch (uiStep) { case 1: if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) != NOT_STARTED) return; bIsBattle = false; Talk(SAY_ESCORT_START); SetRun(true); JumpToNextStep(0); break; case 3: SetEscortPaused(false); JumpToNextStep(0); break; case 5: if (Creature* temp = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))) temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); JumpToNextStep(8500); break; case 6: Talk(SAY_EVENT_A_1); JumpToNextStep(6500); break; case 7: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_A_2_KADD); JumpToNextStep(12500); break; case 8: Talk(SAY_EVENT_A_3); instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; JumpToNextStep(5000); break; case 9: me->SetReactState(REACT_PASSIVE); SpawnDwarf(1); JumpToNextStep(20000); break; case 10: Talk(SAY_EVENT_B_1); JumpToNextStep(6000); break; case 11: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_B_2_MARN); SpawnDwarf(1); JumpToNextStep(20000); break; case 12: Talk(SAY_EVENT_B_3); instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; JumpToNextStep(10000); break; case 13: SpawnDwarf(1); JumpToNextStep(10000); break; case 14: SpawnDwarf(2); JumpToNextStep(20000); break; case 15: Talk(SAY_EVENT_C_1); SpawnDwarf(1); JumpToNextStep(10000); break; case 16: SpawnDwarf(2); JumpToNextStep(20000); break; case 17: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_C_2_ABED); SpawnDwarf(1); JumpToNextStep(20000); break; case 18: Talk(SAY_EVENT_C_3); instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; JumpToNextStep(5000); break; case 19: SpawnDwarf(2); JumpToNextStep(10000); break; case 20: SpawnDwarf(1); JumpToNextStep(15000); break; case 21: Talk(SAY_EVENT_D_1); SpawnDwarf(3); JumpToNextStep(20000); break; case 22: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_D_2_ABED); SpawnDwarf(1); JumpToNextStep(5000); break; case 23: SpawnDwarf(2); JumpToNextStep(15000); break; case 24: Talk(SAY_EVENT_D_3); SpawnDwarf(3); JumpToNextStep(5000); break; case 25: SpawnDwarf(1); JumpToNextStep(5000); break; case 26: SpawnDwarf(2); JumpToNextStep(10000); break; case 27: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_D_4_ABED); SpawnDwarf(1); JumpToNextStep(10000); break; case 28: me->SetReactState(REACT_DEFENSIVE); Talk(SAY_EVENT_END_01); me->SetStandState(UNIT_STAND_STATE_STAND); instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), true); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) temp->DealDamage(temp, temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); bIsBattle = true; SetEscortPaused(false); JumpToNextStep(6500); break; case 29: Talk(SAY_EVENT_END_02); instance->SetBossState(DATA_TRIBUNAL_OF_AGES, DONE); me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); JumpToNextStep(5500); break; case 30: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_03_ABED); JumpToNextStep(8500); break; case 31: Talk(SAY_EVENT_END_04); JumpToNextStep(11500); break; case 32: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_05_ABED); JumpToNextStep(11500); break; case 33: Talk(SAY_EVENT_END_06); JumpToNextStep(4500); break; case 34: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_07_ABED); JumpToNextStep(22500); break; case 35: Talk(SAY_EVENT_END_08); JumpToNextStep(7500); break; case 36: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_09_KADD); JumpToNextStep(18500); break; case 37: Talk(SAY_EVENT_END_10); JumpToNextStep(5500); break; case 38: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_11_KADD); JumpToNextStep(20500); break; case 39: Talk(SAY_EVENT_END_12); JumpToNextStep(2500); break; case 40: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_END_13_KADD); JumpToNextStep(19500); break; case 41: Talk(SAY_EVENT_END_14); JumpToNextStep(10500); break; case 42: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_15_MARN); JumpToNextStep(6500); break; case 43: Talk(SAY_EVENT_END_16); JumpToNextStep(6500); break; case 44: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_17_MARN); JumpToNextStep(25500); break; case 45: Talk(SAY_EVENT_END_18); JumpToNextStep(23500); break; case 46: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_END_19_MARN); JumpToNextStep(3500); break; case 47: Talk(SAY_EVENT_END_20); JumpToNextStep(8500); break; case 48: if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_21_ABED); JumpToNextStep(5500); break; case 49: { instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false); instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false); instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false); instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false); Player* player = GetPlayerForEscort(); if (player) player->GroupEventHappens(QUEST_HALLS_OF_STONE, me); me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); JumpToNextStep(180000); break; } case 50: SetEscortPaused(false); break; } } else uiPhaseTimer -= uiDiff; if (!bIsLowHP && HealthBelowPct(30)) { Talk(SAY_LOW_HEALTH); bIsLowHP = true; } else if (bIsLowHP && !HealthBelowPct(30)) bIsLowHP = false; if (!UpdateVictim()) return; DoMeleeAttackIfReady(); }
void Reset() override { Initialize(); me->SetStandState(UNIT_STAND_STATE_DEAD); instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, NOT_STARTED); }
void JustDied(Unit* /*killer*/) override { instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, DONE); }
void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, IN_PROGRESS); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, DONE); }
void JustDied(Unit* /*killer*/) override { instance->SetBossState(DATA_TERON_GOREFIEND, DONE); Talk(SAY_DEATH); }
void UpdateAI(uint32 diff) override { switch (Phase) { case COMBAT: //Return since we have no target if (!UpdateVictim()) return; if (!bYelled && HealthBelowPct(30)) { Talk(SAY_30HEALTH); bYelled = true; } if (!bYelled2 && HealthBelowPct(15)) { Talk(SAY_15HEALTH); bYelled2 = true; } if (HealthBelowPct(1)) { //Handle Escape Event: Don't forget to add Player::RewardPlayerAndGroupAtEvent me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); uiOutroStep = 1; Phase = OUTRO; return; } if (Creature* pArthas = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ARTHAS))) if (pArthas->isDead()) { EnterEvadeMode(); me->DisappearAndDie(); instance->SetBossState(DATA_MAL_GANIS, FAIL); } if (uiCarrionSwarmTimer < diff) { DoCastVictim(SPELL_CARRION_SWARM); uiCarrionSwarmTimer = 7000; } else uiCarrionSwarmTimer -= diff; if (uiMindBlastTimer < diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_MIND_BLAST); uiMindBlastTimer = 6000; } else uiMindBlastTimer -= diff; if (uiVampiricTouchTimer < diff) { DoCast(me, SPELL_VAMPIRIC_TOUCH); uiVampiricTouchTimer = 32000; } else uiVampiricTouchTimer -= diff; if (uiSleepTimer < diff) { Talk(SAY_SLEEP); if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SLEEP); uiSleepTimer = urand(15000, 20000); } else uiSleepTimer -= diff; DoMeleeAttackIfReady(); break; case OUTRO: if (uiOutroTimer < diff) { switch (uiOutroStep) { case 1: Talk(SAY_OUTRO); me->GetMotionMaster()->MoveTargetedHome(); ++uiOutroStep; uiOutroTimer = 8000; break; case 2: me->SetTarget(instance->GetData64(DATA_ARTHAS)); me->HandleEmoteCommand(29); Talk(SAY_ESCAPE_SPEECH_2); ++uiOutroStep; uiOutroTimer = 9000; break; case 3: Talk(SAY_OUTRO); ++uiOutroStep; //uiOutroTimer = 16000; break; case 4: me->HandleEmoteCommand(33); ++uiOutroStep; uiOutroTimer = 500; break; case 5: me->SetVisible(false); me->Kill(me); break; } } else uiOutroTimer -= diff; break; } }
void EnterCombat(Unit* /*who*/) override { instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); me->SetInCombatWithZone(); }
void Reset() override { Initialize(); instance->SetBossState(DATA_WARLORD_KALITHRESH, NOT_STARTED); }
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 /*action*/) { player->PlayerTalkClass->ClearMenus(); player->CLOSE_GOSSIP_MENU(); InstanceScript* instance = creature->GetInstanceScript(); if (!instance) return true; if (instance->GetBossState(BOSS_BEASTS) != DONE) { instance->SetData(TYPE_EVENT, 110); instance->SetData(TYPE_NORTHREND_BEASTS, NOT_STARTED); instance->SetBossState(BOSS_BEASTS, NOT_STARTED); } else if (instance->GetBossState(BOSS_JARAXXUS) != DONE) { // if Jaraxxus is spawned, but the raid wiped if (Creature* jaraxxus = Unit::GetCreature(*player, instance->GetData64(NPC_JARAXXUS))) { jaraxxus->RemoveAurasDueToSpell(SPELL_JARAXXUS_CHAINS); jaraxxus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); jaraxxus->SetReactState(REACT_DEFENSIVE); jaraxxus->SetInCombatWithZone(); } else { instance->SetData(TYPE_EVENT, 1010); instance->SetBossState(BOSS_JARAXXUS, NOT_STARTED); } } else if (instance->GetBossState(BOSS_CRUSADERS) != DONE) { if (player->GetTeam() == ALLIANCE) instance->SetData(TYPE_EVENT, 3000); else instance->SetData(TYPE_EVENT, 3001); instance->SetBossState(BOSS_CRUSADERS, NOT_STARTED); } else if (instance->GetBossState(BOSS_VALKIRIES) != DONE) { instance->SetData(TYPE_EVENT, 4000); instance->SetBossState(BOSS_VALKIRIES, NOT_STARTED); } else if (instance->GetBossState(BOSS_LICH_KING) != DONE) { if (GameObject* floor = GameObject::GetGameObject(*player, instance->GetData64(GO_ARGENT_COLISEUM_FLOOR))) floor->SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED); creature->CastSpell(creature, SPELL_CORPSE_TELEPORT, false); creature->CastSpell(creature, SPELL_DESTROY_FLOOR_KNOCKUP, false); Creature* anubArak = Unit::GetCreature(*creature, instance->GetData64(NPC_ANUBARAK)); if (!anubArak || !anubArak->isAlive()) anubArak = creature->SummonCreature(NPC_ANUBARAK, AnubarakLoc[0].GetPositionX(), AnubarakLoc[0].GetPositionY(), AnubarakLoc[0].GetPositionZ(), 3, TEMPSUMMON_CORPSE_TIMED_DESPAWN, DESPAWN_TIME); instance->SetBossState(BOSS_ANUBARAK, NOT_STARTED); if (creature->IsVisible()) creature->SetVisible(false); } creature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); return true; }
void JustDied(Unit* /*killer*/) override { instance->SetBossState(DATA_HADRONOX, DONE); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); Summons.DespawnAll(); instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE); }
void JustDied(Unit* /*killer*/) override { Talk(TEXT_DEATH); instance->SetBossState(DATA_JEDOGA_SHADOWSEEKER, DONE); }
void EnterCombat(Unit* attacker) { pInstance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); pInstance->SetBossState(DATA_FENG, IN_PROGRESS); Talk(TALK_AGGRO); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_CRONE_DEATH); instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); }
void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); instance->SetBossState(DATA_WARLORD_KALITHRESH, IN_PROGRESS); }
void JustDied(Unit* /*killer*/) override { DoPlaySoundToSet(me, SOUND_WOLF_DEATH); instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); instance->SetBossState(DATA_WARLORD_KALITHRESH, DONE); }
void Reset() override { Initialize(); instance->SetBossState(DATA_MAL_GANIS, NOT_STARTED); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); instance->SetBossState(DATA_MAULGAR, DONE); }
void JustReachedHome() { instance->SetBossState(DATA_RIMOK, FAIL); summons.DespawnAll(); }
void EnterCombat(Unit* /*who*/) override { DoZoneInCombat(); instance->SetBossState(DATA_MAULGAR, IN_PROGRESS); }
void Reset() override { Initialize(); instance->SetBossState(DATA_MEKGINEER_STEAMRIGGER, NOT_STARTED); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; //Shield_Timer if (Shield_Timer <= diff) { DoCast(me, SPELL_SHIELD); Shield_Timer = 61000; } else Shield_Timer -= diff; //BloodLust_Timer if (BloodLust_Timer <= diff) { DoCast(me, SPELL_BLOODLUST); BloodLust_Timer = 20000 + rand32() % 8000; } else BloodLust_Timer -= diff; //Casting Greaterheal to Thekal or Zath if they are in meele range. if (GreaterHeal_Timer <= diff) { Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL)); Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH)); if (!pThekal || !pZath) return; switch (urand(0, 1)) { case 0: if (me->IsWithinMeleeRange(pThekal)) DoCast(pThekal, SPELL_GREATERHEAL); break; case 1: if (me->IsWithinMeleeRange(pZath)) DoCast(pZath, SPELL_GREATERHEAL); break; } GreaterHeal_Timer = 15000 + rand32() % 5000; } else GreaterHeal_Timer -= diff; //Disarm_Timer if (Disarm_Timer <= diff) { DoCastVictim(SPELL_DISARM); Disarm_Timer = 15000 + rand32() % 10000; } else Disarm_Timer -= diff; //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { if (instance->GetBossState(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pThekal->setFaction(14); pThekal->SetFullHealth(); } } if (instance->GetBossState(DATA_ZATH) == SPECIAL) { //Resurrect Zath if (Unit* pZath = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ZATH))) { pZath->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pZath->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pZath->setFaction(14); pZath->SetFullHealth(); } } Check_Timer = 5000; } else Check_Timer -= diff; if (!HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_SLEEP); me->setFaction(35); me->AttackStop(); instance->SetBossState(DATA_LORKHAN, SPECIAL); FakeDeath = true; } DoMeleeAttackIfReady(); }
void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); instance->SetBossState(DATA_IONAR, IN_PROGRESS); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; //SweepingStrikes_Timer if (SweepingStrikes_Timer <= diff) { DoCastVictim(SPELL_SWEEPINGSTRIKES); SweepingStrikes_Timer = 22000 + rand32() % 4000; } else SweepingStrikes_Timer -= diff; //SinisterStrike_Timer if (SinisterStrike_Timer <= diff) { DoCastVictim(SPELL_SINISTERSTRIKE); SinisterStrike_Timer = 8000 + rand32() % 8000; } else SinisterStrike_Timer -= diff; //Gouge_Timer if (Gouge_Timer <= diff) { DoCastVictim(SPELL_GOUGE); if (DoGetThreat(me->GetVictim())) DoModifyThreatPercent(me->GetVictim(), -100); Gouge_Timer = 17000 + rand32() % 10000; } else Gouge_Timer -= diff; //Kick_Timer if (Kick_Timer <= diff) { DoCastVictim(SPELL_KICK); Kick_Timer = 15000 + rand32() % 10000; } else Kick_Timer -= diff; //Blind_Timer if (Blind_Timer <= diff) { DoCastVictim(SPELL_BLIND); Blind_Timer = 10000 + rand32() % 10000; } else Blind_Timer -= diff; //Check_Timer for the death of LorKhan and Zath. if (!FakeDeath && Check_Timer <= diff) { if (instance->GetBossState(DATA_LORKHAN) == SPECIAL) { //Resurrect LorKhan if (Unit* pLorKhan = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_LORKHAN))) { pLorKhan->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pLorKhan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pLorKhan->setFaction(14); pLorKhan->SetFullHealth(); } } if (instance->GetBossState(DATA_THEKAL) == SPECIAL) { //Resurrect Thekal if (Unit* pThekal = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_THEKAL))) { pThekal->SetUInt32Value(UNIT_FIELD_BYTES_1, 0); pThekal->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); pThekal->setFaction(14); pThekal->SetFullHealth(); } } Check_Timer = 5000; } else Check_Timer -= diff; if (!HealthAbovePct(5)) { me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE); me->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetStandState(UNIT_STAND_STATE_SLEEP); me->setFaction(35); me->AttackStop(); instance->SetBossState(DATA_ZATH, SPECIAL); FakeDeath = true; } DoMeleeAttackIfReady(); }
void EnterCombat(Unit* /*who*/) override { me->SetStandState(UNIT_STAND_STATE_STAND); instance->SetBossState(DATA_HIGH_INQUISITOR_FAIRBANKS, IN_PROGRESS); }
void EnterEvadeMode() { if (instance) instance->SetBossState(DATA_BOSS_GU_CLOUDSTRIKE, FAIL); }
void UpdateAI(uint32 Diff) override { if (AttackStartTimer <= Diff) { switch (Phase) { case 1: instance->SetBossState(BOSS_RAZORSCALE, IN_PROGRESS); summons.DespawnAll(); AttackStartTimer = 1000; Phase = 2; break; case 2: for (uint8 n = 0; n < RAID_MODE(2, 4); n++) { if (Creature* summonedEngineer = me->SummonCreature(NPC_ENGINEER, PosEngSpawn, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000)) { summonedEngineer->SetWalk(false); summonedEngineer->SetSpeedRate(MOVE_RUN, 0.5f); summonedEngineer->SetHomePosition(PosEngRepair[n]); summonedEngineer->GetMotionMaster()->MoveTargetedHome(); Engineer[n] = summonedEngineer->GetGUID(); } } if (Creature* firstSummon = ObjectAccessor::GetCreature(*me, Engineer[0])) firstSummon->AI()->Talk(SAY_AGGRO_3); Phase = 3; AttackStartTimer = 14000; break; case 3: for (uint8 n = 0; n < 4; n++) { if (Creature* summonedDefender = me->SummonCreature(NPC_DEFENDER, PosDefSpawn[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 3000)) { summonedDefender->SetWalk(false); summonedDefender->SetHomePosition(PosDefCombat[n]); summonedDefender->GetMotionMaster()->MoveTargetedHome(); Defender[n] = summonedDefender->GetGUID(); } } Phase = 4; break; case 4: for (uint8 n = 0; n < RAID_MODE(2, 4); n++) if (Creature* summonedEngineer = ObjectAccessor::GetCreature(*me, Engineer[n])) summonedEngineer->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_USE_STANDING); for (uint8 n = 0; n < 4; ++n) if (Creature* summonedDefender = ObjectAccessor::GetCreature(*me, Defender[n])) summonedDefender->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); Talk(SAY_AGGRO_2); AttackStartTimer = 16000; Phase = 5; break; case 5: if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetGuidData(BOSS_RAZORSCALE))) { Razorscale->AI()->DoAction(ACTION_EVENT_START); me->SetInCombatWith(Razorscale); } if (Creature* firstEngineer = ObjectAccessor::GetCreature(*me, Engineer[0])) firstEngineer->AI()->Talk(SAY_AGGRO_1); Phase = 6; break; } } else AttackStartTimer -= Diff; }
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(); }