diff options
Diffstat (limited to 'src')
4 files changed, 450 insertions, 505 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp index 78ad471a3c1..3b62dc50691 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp @@ -33,67 +33,56 @@ enum Events EVENT_SHADOWOFEBONROC = 3 }; -class boss_ebonroc : public CreatureScript +struct boss_ebonroc : public BossAI { -public: - boss_ebonroc() : CreatureScript("boss_ebonroc") { } + boss_ebonroc(Creature* creature) : BossAI(creature, DATA_EBONROC) { } - struct boss_ebonrocAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_ebonrocAI(Creature* creature) : BossAI(creature, DATA_EBONROC) { } + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8s, 10s); - } + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8s, 10s); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_SHADOWFLAME: - DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - break; - case EVENT_WINGBUFFET: - DoCastVictim(SPELL_WINGBUFFET); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - break; - case EVENT_SHADOWOFEBONROC: - DoCastVictim(SPELL_SHADOWOFEBONROC); - events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8s, 10s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_SHADOWFLAME: + DoCastVictim(SPELL_SHADOWFLAME); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + break; + case EVENT_WINGBUFFET: + DoCastVictim(SPELL_WINGBUFFET); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + break; + case EVENT_SHADOWOFEBONROC: + DoCastVictim(SPELL_SHADOWOFEBONROC); + events.ScheduleEvent(EVENT_SHADOWOFEBONROC, 8s, 10s); + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackwingLairAI<boss_ebonrocAI>(creature); + DoMeleeAttackIfReady(); } }; void AddSC_boss_ebonroc() { - new boss_ebonroc(); + RegisterBlackwingLairCreatureAI(boss_ebonroc); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp index 449aea15e99..d74574de642 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp @@ -33,69 +33,58 @@ enum Events EVENT_FLAMEBUFFET = 3 }; -class boss_firemaw : public CreatureScript +struct boss_firemaw : public BossAI { -public: - boss_firemaw() : CreatureScript("boss_firemaw") { } + boss_firemaw(Creature* creature) : BossAI(creature, DATA_FIREMAW) { } - struct boss_firemawAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_firemawAI(Creature* creature) : BossAI(creature, DATA_FIREMAW) { } + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - events.ScheduleEvent(EVENT_FLAMEBUFFET, 5s); - } + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + events.ScheduleEvent(EVENT_FLAMEBUFFET, 5s); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_SHADOWFLAME: - DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - break; - case EVENT_WINGBUFFET: - DoCastVictim(SPELL_WINGBUFFET); - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(me->GetVictim(), -75); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - break; - case EVENT_FLAMEBUFFET: - DoCastVictim(SPELL_FLAMEBUFFET); - events.ScheduleEvent(EVENT_FLAMEBUFFET, 5s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_SHADOWFLAME: + DoCastVictim(SPELL_SHADOWFLAME); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + break; + case EVENT_WINGBUFFET: + DoCastVictim(SPELL_WINGBUFFET); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -75); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + break; + case EVENT_FLAMEBUFFET: + DoCastVictim(SPELL_FLAMEBUFFET); + events.ScheduleEvent(EVENT_FLAMEBUFFET, 5s); + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackwingLairAI<boss_firemawAI>(creature); + DoMeleeAttackIfReady(); } }; void AddSC_boss_firemaw() { - new boss_firemaw(); + RegisterBlackwingLairCreatureAI(boss_firemaw); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp index dacc867df4c..33061d520b5 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp @@ -38,70 +38,59 @@ enum Events EVENT_FRENZY = 3 }; -class boss_flamegor : public CreatureScript +struct boss_flamegor : public BossAI { -public: - boss_flamegor() : CreatureScript("boss_flamegor") { } + boss_flamegor(Creature* creature) : BossAI(creature, DATA_FLAMEGOR) { } - struct boss_flamegorAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_flamegorAI(Creature* creature) : BossAI(creature, DATA_FLAMEGOR) { } + BossAI::JustEngagedWith(who); - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - events.ScheduleEvent(EVENT_FRENZY, 10s); - } + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + events.ScheduleEvent(EVENT_FRENZY, 10s); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_SHADOWFLAME: - DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); - break; - case EVENT_WINGBUFFET: - DoCastVictim(SPELL_WINGBUFFET); - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(me->GetVictim(), -75); - events.ScheduleEvent(EVENT_WINGBUFFET, 30s); - break; - case EVENT_FRENZY: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 8s, 10s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + case EVENT_SHADOWFLAME: + DoCastVictim(SPELL_SHADOWFLAME); + events.ScheduleEvent(EVENT_SHADOWFLAME, 10s, 20s); + break; + case EVENT_WINGBUFFET: + DoCastVictim(SPELL_WINGBUFFET); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -75); + events.ScheduleEvent(EVENT_WINGBUFFET, 30s); + break; + case EVENT_FRENZY: + Talk(EMOTE_FRENZY); + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, 8s, 10s); + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackwingLairAI<boss_flamegorAI>(creature); + DoMeleeAttackIfReady(); } }; void AddSC_boss_flamegor() { - new boss_flamegor(); + RegisterBlackwingLairCreatureAI(boss_flamegor); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index e3721f2330f..6bc3b545565 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -162,448 +162,426 @@ Position const NefarianLoc[2] = uint32 const Entry[5] = {NPC_BRONZE_DRAKANOID, NPC_BLUE_DRAKANOID, NPC_RED_DRAKANOID, NPC_GREEN_DRAKANOID, NPC_BLACK_DRAKANOID}; -class boss_victor_nefarius : public CreatureScript +struct boss_victor_nefarius : public BossAI { -public: - boss_victor_nefarius() : CreatureScript("boss_victor_nefarius") { } + boss_victor_nefarius(Creature* creature) : BossAI(creature, DATA_NEFARIAN) + { + Initialize(); + } - struct boss_victor_nefariusAI : public BossAI + void Initialize() { - boss_victor_nefariusAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) - { - Initialize(); - } + SpawnedAdds = 0; + } + + void Reset() override + { + Initialize(); - void Initialize() + if (me->GetMapId() == 469) { - SpawnedAdds = 0; + if (!me->FindNearestCreature(NPC_NEFARIAN, 1000.0f, true)) + _Reset(); + + me->SetVisible(true); + me->SetPhaseMask(1, true); + me->SetUInt32Value(UNIT_NPC_FLAGS, 1); + me->SetFaction(FACTION_FRIENDLY); + me->SetStandState(UNIT_STAND_STATE_SIT_HIGH_CHAIR); + me->RemoveAura(SPELL_NEFARIANS_BARRIER); } + } - void Reset() override - { - Initialize(); + void JustReachedHome() override + { + Reset(); + } - if (me->GetMapId() == 469) - { - if (!me->FindNearestCreature(NPC_NEFARIAN, 1000.0f, true)) - _Reset(); - - me->SetVisible(true); - me->SetPhaseMask(1, true); - me->SetUInt32Value(UNIT_NPC_FLAGS, 1); - me->SetFaction(FACTION_FRIENDLY); - me->SetStandState(UNIT_STAND_STATE_SIT_HIGH_CHAIR); - me->RemoveAura(SPELL_NEFARIANS_BARRIER); - } - } + void BeginEvent(Player* target) + { + _JustEngagedWith(target); + + Talk(SAY_GAMESBEGIN_2); + + me->SetFaction(FACTION_DRAGONFLIGHT_BLACK); + me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); + DoCast(me, SPELL_NEFARIANS_BARRIER); + me->SetStandState(UNIT_STAND_STATE_STAND); + me->SetImmuneToPC(false); + AttackStart(target); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 3s, 10s); + events.ScheduleEvent(EVENT_FEAR, 10s, 20s); + //events.ScheduleEvent(EVENT_MIND_CONTROL, 30s, 35s); + events.ScheduleEvent(EVENT_SPAWN_ADD, 10s); + } - void JustReachedHome() override + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (summon->GetEntry() != NPC_NEFARIAN) { - Reset(); + summon->UpdateEntry(NPC_BONE_CONSTRUCT); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + summon->SetReactState(REACT_PASSIVE); + summon->SetStandState(UNIT_STAND_STATE_DEAD); } + } - void BeginEvent(Player* target) - { - _JustEngagedWith(target); - - Talk(SAY_GAMESBEGIN_2); - - me->SetFaction(FACTION_DRAGONFLIGHT_BLACK); - me->SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); - DoCast(me, SPELL_NEFARIANS_BARRIER); - me->SetStandState(UNIT_STAND_STATE_STAND); - me->SetImmuneToPC(false); - AttackStart(target); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 3s, 10s); - events.ScheduleEvent(EVENT_FEAR, 10s, 20s); - //events.ScheduleEvent(EVENT_MIND_CONTROL, 30s, 35s); - events.ScheduleEvent(EVENT_SPAWN_ADD, 10s); - } + void JustSummoned(Creature* /*summon*/) override { } - void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + void SetData(uint32 type, uint32 data) override + { + if ( type == 1 && data == 1) { - if (summon->GetEntry() != NPC_NEFARIAN) - { - summon->UpdateEntry(NPC_BONE_CONSTRUCT); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - summon->SetReactState(REACT_PASSIVE); - summon->SetStandState(UNIT_STAND_STATE_DEAD); - } + me->StopMoving(); + events.ScheduleEvent(EVENT_PATH_2, 9s); } - void JustSummoned(Creature* /*summon*/) override { } + if (type == 1 && data == 2) + events.ScheduleEvent(EVENT_SUCCESS_1, 5s); + } - void SetData(uint32 type, uint32 data) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) { - if ( type == 1 && data == 1) + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - me->StopMoving(); - events.ScheduleEvent(EVENT_PATH_2, 9s); + switch (eventId) + { + case EVENT_PATH_2: + me->GetMotionMaster()->MovePath(NEFARIUS_PATH_2, false); + events.ScheduleEvent(EVENT_CHAOS_1, 7s); + break; + case EVENT_CHAOS_1: + if (Creature* gyth = me->FindNearestCreature(NPC_GYTH, 75.0f, true)) + { + me->SetFacingToObject(gyth); + Talk(SAY_CHAOS_SPELL); + } + events.ScheduleEvent(EVENT_CHAOS_2, 2s); + break; + case EVENT_CHAOS_2: + DoCast(SPELL_CHROMATIC_CHAOS); + me->SetFacingTo(1.570796f); + break; + case EVENT_SUCCESS_1: + if (Unit* player = me->SelectNearestPlayer(60.0f)) + { + me->SetFacingToObject(player); + Talk(SAY_SUCCESS); + if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f)) + portcullis1->SetGoState(GO_STATE_ACTIVE); + if (GameObject* portcullis2 = me->FindNearestGameObject(GO_PORTCULLIS_TOBOSSROOMS, 80.0f)) + portcullis2->SetGoState(GO_STATE_ACTIVE); + } + events.ScheduleEvent(EVENT_SUCCESS_2, 4s); + break; + case EVENT_SUCCESS_2: + DoCast(me, SPELL_VAELASTRASZZ_SPAWN); + me->DespawnOrUnsummon(1s); + break; + case EVENT_PATH_3: + me->GetMotionMaster()->MovePath(NEFARIUS_PATH_3, false); + break; + default: + break; + } } - - if (type == 1 && data == 2) - events.ScheduleEvent(EVENT_SUCCESS_1, 5s); + return; } - void UpdateAI(uint32 diff) override + // Only do this if we haven't spawned nefarian yet + if (UpdateVictim() && SpawnedAdds <= 42) { - if (!UpdateVictim()) - { - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_PATH_2: - me->GetMotionMaster()->MovePath(NEFARIUS_PATH_2, false); - events.ScheduleEvent(EVENT_CHAOS_1, 7s); - break; - case EVENT_CHAOS_1: - if (Creature* gyth = me->FindNearestCreature(NPC_GYTH, 75.0f, true)) - { - me->SetFacingToObject(gyth); - Talk(SAY_CHAOS_SPELL); - } - events.ScheduleEvent(EVENT_CHAOS_2, 2s); - break; - case EVENT_CHAOS_2: - DoCast(SPELL_CHROMATIC_CHAOS); - me->SetFacingTo(1.570796f); - break; - case EVENT_SUCCESS_1: - if (Unit* player = me->SelectNearestPlayer(60.0f)) - { - me->SetFacingToObject(player); - Talk(SAY_SUCCESS); - if (GameObject* portcullis1 = me->FindNearestGameObject(GO_PORTCULLIS_ACTIVE, 65.0f)) - portcullis1->SetGoState(GO_STATE_ACTIVE); - if (GameObject* portcullis2 = me->FindNearestGameObject(GO_PORTCULLIS_TOBOSSROOMS, 80.0f)) - portcullis2->SetGoState(GO_STATE_ACTIVE); - } - events.ScheduleEvent(EVENT_SUCCESS_2, 4s); - break; - case EVENT_SUCCESS_2: - DoCast(me, SPELL_VAELASTRASZZ_SPAWN); - me->DespawnOrUnsummon(1s); - break; - case EVENT_PATH_3: - me->GetMotionMaster()->MovePath(NEFARIUS_PATH_3, false); - break; - default: - break; - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - } - // Only do this if we haven't spawned nefarian yet - if (UpdateVictim() && SpawnedAdds <= 42) + while (uint32 eventId = events.ExecuteEvent()) { - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_SHADOW_BOLT: - switch (urand(0, 1)) + case EVENT_SHADOW_BOLT: + switch (urand(0, 1)) + { + case 0: + DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); + break; + case 1: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) + DoCast(target, SPELL_SHADOWBOLT); + break; + } + ResetThreatList(); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 3s, 10s); + break; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) + DoCast(target, SPELL_FEAR); + events.ScheduleEvent(EVENT_FEAR, 10s, 20s); + break; + case EVENT_MIND_CONTROL: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) + DoCast(target, SPELL_SHADOW_COMMAND); + events.ScheduleEvent(EVENT_MIND_CONTROL, 30s, 35s); + break; + case EVENT_SPAWN_ADD: + for (uint8 i=0; i<2; ++i) + { + uint32 CreatureID; + if (urand(0, 2) == 0) + CreatureID = NPC_CHROMATIC_DRAKANOID; + else + CreatureID = Entry[urand(0, 4)]; + if (Creature* dragon = me->SummonCreature(CreatureID, DrakeSpawnLoc[i])) { - case 0: - DoCastVictim(SPELL_SHADOWBOLT_VOLLEY); - break; - case 1: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) - DoCast(target, SPELL_SHADOWBOLT); - break; + dragon->SetFaction(FACTION_DRAGONFLIGHT_BLACK); + dragon->AI()->AttackStart(me->GetVictim()); } - ResetThreatList(); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 3s, 10s); - break; - case EVENT_FEAR: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) - DoCast(target, SPELL_FEAR); - events.ScheduleEvent(EVENT_FEAR, 10s, 20s); - break; - case EVENT_MIND_CONTROL: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40, true)) - DoCast(target, SPELL_SHADOW_COMMAND); - events.ScheduleEvent(EVENT_MIND_CONTROL, 30s, 35s); - break; - case EVENT_SPAWN_ADD: - for (uint8 i=0; i<2; ++i) - { - uint32 CreatureID; - if (urand(0, 2) == 0) - CreatureID = NPC_CHROMATIC_DRAKANOID; - else - CreatureID = Entry[urand(0, 4)]; - if (Creature* dragon = me->SummonCreature(CreatureID, DrakeSpawnLoc[i])) - { - dragon->SetFaction(FACTION_DRAGONFLIGHT_BLACK); - dragon->AI()->AttackStart(me->GetVictim()); - } - if (++SpawnedAdds >= 42) + if (++SpawnedAdds >= 42) + { + if (Creature* nefarian = me->SummonCreature(NPC_NEFARIAN, NefarianLoc[0])) { - if (Creature* nefarian = me->SummonCreature(NPC_NEFARIAN, NefarianLoc[0])) - { - nefarian->setActive(true); - nefarian->SetFarVisible(true); - nefarian->SetCanFly(true); - nefarian->SetDisableGravity(true); - nefarian->CastSpell(nullptr, SPELL_SHADOWFLAME_INITIAL); - nefarian->GetMotionMaster()->MovePoint(1, NefarianLoc[1]); - } - events.CancelEvent(EVENT_MIND_CONTROL); - events.CancelEvent(EVENT_FEAR); - events.CancelEvent(EVENT_SHADOW_BOLT); - me->SetVisible(false); - return; + nefarian->setActive(true); + nefarian->SetFarVisible(true); + nefarian->SetCanFly(true); + nefarian->SetDisableGravity(true); + nefarian->CastSpell(nullptr, SPELL_SHADOWFLAME_INITIAL); + nefarian->GetMotionMaster()->MovePoint(1, NefarianLoc[1]); } + events.CancelEvent(EVENT_MIND_CONTROL); + events.CancelEvent(EVENT_FEAR); + events.CancelEvent(EVENT_SHADOW_BOLT); + me->SetVisible(false); + return; } - events.ScheduleEvent(EVENT_SPAWN_ADD, 4s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + } + events.ScheduleEvent(EVENT_SPAWN_ADD, 4s); + break; } - } - } - bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override - { - if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) - { - CloseGossipMenuFor(player); - Talk(SAY_GAMESBEGIN_1); - BeginEvent(player); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - return false; } + } - private: - uint32 SpawnedAdds; - }; - - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override { - return GetBlackwingLairAI<boss_victor_nefariusAI>(creature); + if (menuId == GOSSIP_ID && gossipListId == GOSSIP_OPTION_ID) + { + CloseGossipMenuFor(player); + Talk(SAY_GAMESBEGIN_1); + BeginEvent(player); + } + return false; } + + private: + uint32 SpawnedAdds; }; -class boss_nefarian : public CreatureScript +struct boss_nefarian : public BossAI { -public: - boss_nefarian() : CreatureScript("boss_nefarian") { } + boss_nefarian(Creature* creature) : BossAI(creature, DATA_NEFARIAN) + { + Initialize(); + } - struct boss_nefarianAI : public BossAI + void Initialize() { - boss_nefarianAI(Creature* creature) : BossAI(creature, DATA_NEFARIAN) - { - Initialize(); - } + Phase3 = false; + canDespawn = false; + DespawnTimer = 30000; + } - void Initialize() - { - Phase3 = false; - canDespawn = false; - DespawnTimer = 30000; - } + void Reset() override + { + Initialize(); + } - void Reset() override - { - Initialize(); - } + void JustReachedHome() override + { + canDespawn = true; + } - void JustReachedHome() override - { - canDespawn = true; - } + void JustEngagedWith(Unit* /*who*/) override + { + events.ScheduleEvent(EVENT_SHADOWFLAME, 12s); + events.ScheduleEvent(EVENT_FEAR, 25s, 35s); + events.ScheduleEvent(EVENT_VEILOFSHADOW, 25s, 35s); + events.ScheduleEvent(EVENT_CLEAVE, 7s); + //events.ScheduleEvent(EVENT_TAILLASH, 10s); + events.ScheduleEvent(EVENT_CLASSCALL, 30s, 35s); + Talk(SAY_RANDOM); + } - void JustEngagedWith(Unit* /*who*/) override - { - events.ScheduleEvent(EVENT_SHADOWFLAME, 12s); - events.ScheduleEvent(EVENT_FEAR, 25s, 35s); - events.ScheduleEvent(EVENT_VEILOFSHADOW, 25s, 35s); - events.ScheduleEvent(EVENT_CLEAVE, 7s); - //events.ScheduleEvent(EVENT_TAILLASH, 10s); - events.ScheduleEvent(EVENT_CLASSCALL, 30s, 35s); - Talk(SAY_RANDOM); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + void KilledUnit(Unit* victim) override + { + if (rand32() % 5) + return; - void KilledUnit(Unit* victim) override - { - if (rand32() % 5) - return; + Talk(SAY_SLAY, victim); + } - Talk(SAY_SLAY, victim); - } + void MovementInform(uint32 type, uint32 id) override + { + if (type != POINT_MOTION_TYPE) + return; - void MovementInform(uint32 type, uint32 id) override + if (id == 1) { - if (type != POINT_MOTION_TYPE) - return; - - if (id == 1) - { - DoZoneInCombat(); - if (me->GetVictim()) - AttackStart(me->GetVictim()); - } + DoZoneInCombat(); + if (me->GetVictim()) + AttackStart(me->GetVictim()); } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (canDespawn && DespawnTimer <= diff) { - if (canDespawn && DespawnTimer <= diff) - { - instance->SetBossState(DATA_NEFARIAN, FAIL); + instance->SetBossState(DATA_NEFARIAN, FAIL); - std::list<Creature*> constructList; - me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); - for (std::list<Creature*>::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) - (*itr)->DespawnOrUnsummon(); + std::list<Creature*> constructList; + me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); + for (std::list<Creature*>::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) + (*itr)->DespawnOrUnsummon(); - } else DespawnTimer -= diff; + } else DespawnTimer -= diff; - if (!UpdateVictim()) - return; + if (!UpdateVictim()) + return; - if (canDespawn) - canDespawn = false; + if (canDespawn) + canDespawn = false; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHADOWFLAME: - DoCastVictim(SPELL_SHADOWFLAME); - events.ScheduleEvent(EVENT_SHADOWFLAME, 12s); - break; - case EVENT_FEAR: - DoCastVictim(SPELL_BELLOWINGROAR); - events.ScheduleEvent(EVENT_FEAR, 25s, 35s); - break; - case EVENT_VEILOFSHADOW: - DoCastVictim(SPELL_VEILOFSHADOW); - events.ScheduleEvent(EVENT_VEILOFSHADOW, 25s, 35s); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 7s); - break; - case EVENT_TAILLASH: - // Cast NYI since we need a better check for behind target - DoCastVictim(SPELL_TAILLASH); - events.ScheduleEvent(EVENT_TAILLASH, 10s); - break; - case EVENT_CLASSCALL: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - switch (target->GetClass()) - { - case CLASS_MAGE: - Talk(SAY_MAGE); - DoCast(me, SPELL_MAGE); - break; - case CLASS_WARRIOR: - Talk(SAY_WARRIOR); - DoCast(me, SPELL_WARRIOR); - break; - case CLASS_DRUID: - Talk(SAY_DRUID); - DoCast(target, SPELL_DRUID); - break; - case CLASS_PRIEST: - Talk(SAY_PRIEST); - DoCast(me, SPELL_PRIEST); - break; - case CLASS_PALADIN: - Talk(SAY_PALADIN); - DoCast(me, SPELL_PALADIN); - break; - case CLASS_SHAMAN: - Talk(SAY_SHAMAN); - DoCast(me, SPELL_SHAMAN); - break; - case CLASS_WARLOCK: - Talk(SAY_WARLOCK); - DoCast(me, SPELL_WARLOCK); - break; - case CLASS_HUNTER: - Talk(SAY_HUNTER); - DoCast(me, SPELL_HUNTER); - break; - case CLASS_ROGUE: - Talk(SAY_ROGUE); - DoCast(me, SPELL_ROGUE); - break; - case CLASS_DEATH_KNIGHT: - Talk(SAY_DEATH_KNIGHT); - DoCast(me, SPELL_DEATH_KNIGHT); - break; - default: - break; - } - events.ScheduleEvent(EVENT_CLASSCALL, 30s, 35s); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - // Phase3 begins when health below 20 pct - if (!Phase3 && HealthBelowPct(20)) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - std::list<Creature*> constructList; - me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); - for (std::list<Creature*>::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) - if ((*itr) && !(*itr)->IsAlive()) + case EVENT_SHADOWFLAME: + DoCastVictim(SPELL_SHADOWFLAME); + events.ScheduleEvent(EVENT_SHADOWFLAME, 12s); + break; + case EVENT_FEAR: + DoCastVictim(SPELL_BELLOWINGROAR); + events.ScheduleEvent(EVENT_FEAR, 25s, 35s); + break; + case EVENT_VEILOFSHADOW: + DoCastVictim(SPELL_VEILOFSHADOW); + events.ScheduleEvent(EVENT_VEILOFSHADOW, 25s, 35s); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.ScheduleEvent(EVENT_CLEAVE, 7s); + break; + case EVENT_TAILLASH: + // Cast NYI since we need a better check for behind target + DoCastVictim(SPELL_TAILLASH); + events.ScheduleEvent(EVENT_TAILLASH, 10s); + break; + case EVENT_CLASSCALL: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + switch (target->GetClass()) { - (*itr)->Respawn(); - DoZoneInCombat((*itr)); - (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - (*itr)->SetReactState(REACT_AGGRESSIVE); - (*itr)->SetStandState(UNIT_STAND_STATE_STAND); + case CLASS_MAGE: + Talk(SAY_MAGE); + DoCast(me, SPELL_MAGE); + break; + case CLASS_WARRIOR: + Talk(SAY_WARRIOR); + DoCast(me, SPELL_WARRIOR); + break; + case CLASS_DRUID: + Talk(SAY_DRUID); + DoCast(target, SPELL_DRUID); + break; + case CLASS_PRIEST: + Talk(SAY_PRIEST); + DoCast(me, SPELL_PRIEST); + break; + case CLASS_PALADIN: + Talk(SAY_PALADIN); + DoCast(me, SPELL_PALADIN); + break; + case CLASS_SHAMAN: + Talk(SAY_SHAMAN); + DoCast(me, SPELL_SHAMAN); + break; + case CLASS_WARLOCK: + Talk(SAY_WARLOCK); + DoCast(me, SPELL_WARLOCK); + break; + case CLASS_HUNTER: + Talk(SAY_HUNTER); + DoCast(me, SPELL_HUNTER); + break; + case CLASS_ROGUE: + Talk(SAY_ROGUE); + DoCast(me, SPELL_ROGUE); + break; + case CLASS_DEATH_KNIGHT: + Talk(SAY_DEATH_KNIGHT); + DoCast(me, SPELL_DEATH_KNIGHT); + break; + default: + break; } - - Phase3 = true; - Talk(SAY_RAISE_SKELETONS); + events.ScheduleEvent(EVENT_CLASSCALL, 30s, 35s); + break; } - DoMeleeAttackIfReady(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - private: - bool canDespawn; - uint32 DespawnTimer; - bool Phase3; + // Phase3 begins when health below 20 pct + if (!Phase3 && HealthBelowPct(20)) + { + std::list<Creature*> constructList; + me->GetCreatureListWithEntryInGrid(constructList, NPC_BONE_CONSTRUCT, 500.0f); + for (std::list<Creature*>::const_iterator itr = constructList.begin(); itr != constructList.end(); ++itr) + if ((*itr) && !(*itr)->IsAlive()) + { + (*itr)->Respawn(); + DoZoneInCombat((*itr)); + (*itr)->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + (*itr)->SetReactState(REACT_AGGRESSIVE); + (*itr)->SetStandState(UNIT_STAND_STATE_STAND); + } - }; + Phase3 = true; + Talk(SAY_RAISE_SKELETONS); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackwingLairAI<boss_nefarianAI>(creature); + DoMeleeAttackIfReady(); } + +private: + bool canDespawn; + uint32 DespawnTimer; + bool Phase3; + }; void AddSC_boss_nefarian() { - new boss_victor_nefarius(); - new boss_nefarian(); + RegisterBlackwingLairCreatureAI(boss_victor_nefarius); + RegisterBlackwingLairCreatureAI(boss_nefarian); } |