aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_ebonroc.cpp79
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_firemaw.cpp83
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_flamegor.cpp85
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp708
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);
}