aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h1
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp276
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp557
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp114
4 files changed, 443 insertions, 505 deletions
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
index 5420e9b9681..de6d9e04db6 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/blood_furnace.h
@@ -91,5 +91,6 @@ inline AI* GetBloodFurnaceAI(T* obj)
}
#define RegisterBloodFurnaceCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetBloodFurnaceAI)
+#define RegisterBloodFurnaceGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetBloodFurnaceAI)
#endif // BLOOD_FURNACE_H_
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
index 57d19f73a37..068b70116b7 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_broggok.cpp
@@ -26,12 +26,12 @@
#include "SpellAuraEffects.h"
#include "SpellScript.h"
-enum Yells
+enum BroggokTexts
{
- SAY_AGGRO = 0
+ SAY_AGGRO = 0
};
-enum Spells
+enum BroggokSpells
{
SPELL_SLIME_SPRAY = 30913,
SPELL_POISON_CLOUD = 30916,
@@ -46,107 +46,98 @@ enum Spells
SPELL_CHARGE = 22120
};
-enum Events
+enum BroggokEvents
{
- EVENT_SLIME_SPRAY = 1,
+ EVENT_SLIME_SPRAY = 1,
EVENT_POISON_BOLT,
EVENT_POISON_CLOUD,
};
-class boss_broggok : public CreatureScript
+// 17380 - Broggok
+struct boss_broggok : public BossAI
{
- public:
- boss_broggok() : CreatureScript("boss_broggok") { }
+ boss_broggok(Creature* creature) : BossAI(creature, DATA_BROGGOK) { }
- struct boss_broggokAI : public BossAI
- {
- boss_broggokAI(Creature* creature) : BossAI(creature, DATA_BROGGOK) { }
-
- void Reset() override
- {
- _Reset();
- DoAction(ACTION_RESET_BROGGOK);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- }
-
- void JustSummoned(Creature* summoned) override
- {
- if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD)
- {
- summoned->SetReactState(REACT_PASSIVE);
- summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true);
- summons.Summon(summoned);
- }
- else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER)
- {
- summoned->SetReactState(REACT_PASSIVE);
- DoZoneInCombat(summoned);
- summons.Summon(summoned);
- }
- }
+ void Reset() override
+ {
+ _Reset();
+ DoAction(ACTION_RESET_BROGGOK);
+ }
- void ExecuteEvent(uint32 eventId) override
- {
- switch (eventId)
- {
- case EVENT_SLIME_SPRAY:
- DoCastVictim(SPELL_SLIME_SPRAY);
- events.ScheduleEvent(EVENT_SLIME_SPRAY, 4s, 12s);
- break;
- case EVENT_POISON_BOLT:
- DoCastVictim(SPELL_POISON_BOLT);
- events.ScheduleEvent(EVENT_POISON_BOLT, 4s, 12s);
- break;
- case EVENT_POISON_CLOUD:
- DoCast(me, SPELL_POISON_CLOUD);
- events.ScheduleEvent(EVENT_POISON_CLOUD, 20s);
- break;
- default:
- break;
- }
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+
+ events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
+ events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
+ events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
+ }
- void DoAction(int32 action) override
- {
- switch (action)
+ void JustSummoned(Creature* summoned) override
+ {
+ if (summoned->GetEntry() == NPC_BROGGOK_POISON_CLOUD)
+ {
+ summoned->SetReactState(REACT_PASSIVE);
+ summoned->CastSpell(summoned, SPELL_POISON_CLOUD_PASSIVE, true);
+ summons.Summon(summoned);
+ }
+ else if (summoned->GetEntry() == NPC_INCOMBAT_TRIGGER)
+ {
+ summoned->SetReactState(REACT_PASSIVE);
+ DoZoneInCombat(summoned);
+ summons.Summon(summoned);
+ }
+ }
+
+ void DoAction(int32 action) override
+ {
+ switch (action)
+ {
+ case ACTION_PREPARE_BROGGOK:
+ DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
+ break;
+ case ACTION_ACTIVATE_BROGGOK:
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ DoZoneInCombat();
+ break;
+ case ACTION_RESET_BROGGOK:
+ me->SetReactState(REACT_PASSIVE);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ summons.DespawnAll();
+ instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
+ if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
{
- case ACTION_PREPARE_BROGGOK:
- DoCastSelf(SPELL_SUMMON_INCOMBAT_TRIGGER);
- break;
- case ACTION_ACTIVATE_BROGGOK:
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- DoZoneInCombat();
- events.ScheduleEvent(EVENT_SLIME_SPRAY, 10s);
- events.ScheduleEvent(EVENT_POISON_BOLT, 7s);
- events.ScheduleEvent(EVENT_POISON_CLOUD, 5s);
- break;
- case ACTION_RESET_BROGGOK:
- me->SetReactState(REACT_PASSIVE);
- me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- summons.DespawnAll();
- instance->SetBossState(DATA_BROGGOK, NOT_STARTED);
- if (GameObject * lever = instance->GetGameObject(DATA_BROGGOK_LEVER))
- {
- lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
- lever->SetGoState(GO_STATE_READY);
- }
- break;
- default:
- break;
+ lever->RemoveFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
+ lever->SetGoState(GO_STATE_READY);
}
- }
- };
+ break;
+ default:
+ break;
+ }
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
{
- return GetBloodFurnaceAI<boss_broggokAI>(creature);
+ case EVENT_SLIME_SPRAY:
+ DoCastVictim(SPELL_SLIME_SPRAY);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_POISON_BOLT:
+ DoCastVictim(SPELL_POISON_BOLT);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_POISON_CLOUD:
+ DoCastSelf(SPELL_POISON_CLOUD);
+ events.Repeat(20s);
+ break;
+ default:
+ break;
}
+ }
};
static Emote const PrisionersEmotes[] =
@@ -204,6 +195,7 @@ protected:
TaskScheduler scheduler;
};
+// 17398 - Nascent Fel Orc
struct npc_nascent_fel_orc : public BroggokPrisionersAI
{
npc_nascent_fel_orc(Creature* creature) : BroggokPrisionersAI(creature) { }
@@ -223,6 +215,7 @@ struct npc_nascent_fel_orc : public BroggokPrisionersAI
};
+// 17429 - Fel Orc Neophyte
struct npc_fel_orc_neophyte : public BroggokPrisionersAI
{
npc_fel_orc_neophyte(Creature* creature) : BroggokPrisionersAI(creature) { }
@@ -242,82 +235,61 @@ struct npc_fel_orc_neophyte : public BroggokPrisionersAI
};
-class go_broggok_lever : public GameObjectScript
+// 181982 - Cell Door Lever
+struct go_broggok_lever : public GameObjectAI
{
- public:
- go_broggok_lever() : GameObjectScript("go_broggok_lever") { }
+ go_broggok_lever(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
- struct go_broggok_leverAI : public GameObjectAI
- {
- go_broggok_leverAI(GameObject* go) : GameObjectAI(go), instance(go->GetInstanceScript()) { }
-
- InstanceScript* instance;
-
- bool OnGossipHello(Player* /*player*/) override
- {
- if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS)
- {
- instance->SetBossState(DATA_BROGGOK, IN_PROGRESS);
- if (Creature* broggok = instance->GetCreature(DATA_BROGGOK))
- broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
- }
-
- me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
- me->SetGoState(GO_STATE_ACTIVE);
-
- return true;
- }
- };
+ InstanceScript* instance;
- GameObjectAI* GetAI(GameObject* go) const override
+ bool OnGossipHello(Player* /*player*/) override
+ {
+ if (instance->GetBossState(DATA_BROGGOK) != DONE && instance->GetBossState(DATA_BROGGOK) != IN_PROGRESS)
{
- return GetBloodFurnaceAI<go_broggok_leverAI>(go);
+ instance->SetBossState(DATA_BROGGOK, IN_PROGRESS);
+ if (Creature* broggok = instance->GetCreature(DATA_BROGGOK))
+ broggok->AI()->DoAction(ACTION_PREPARE_BROGGOK);
}
+
+ me->SetFlag(GO_FLAG_NOT_SELECTABLE | GO_FLAG_IN_USE);
+ me->SetGoState(GO_STATE_ACTIVE);
+
+ return true;
+ }
};
// 30914, 38462 - Poison
-class spell_broggok_poison_cloud : public SpellScriptLoader
+class spell_broggok_poison_cloud : public AuraScript
{
- public:
- spell_broggok_poison_cloud() : SpellScriptLoader("spell_broggok_poison_cloud") { }
+ PrepareAuraScript(spell_broggok_poison_cloud);
- class spell_broggok_poison_cloud_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_broggok_poison_cloud_AuraScript);
-
- bool Validate(SpellInfo const* spellInfo) override
- {
- return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
- }
-
- void PeriodicTick(AuraEffect const* aurEff)
- {
- PreventDefaultAction();
- if (!aurEff->GetTotalTicks())
- return;
-
- uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
- int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
- GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod));
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_broggok_poison_cloud_AuraScript();
- }
+ bool Validate(SpellInfo const* spellInfo) override
+ {
+ return ValidateSpellInfo({ spellInfo->GetEffect(EFFECT_0).TriggerSpell });
+ }
+
+ void PeriodicTick(AuraEffect const* aurEff)
+ {
+ PreventDefaultAction();
+ if (!aurEff->GetTotalTicks())
+ return;
+
+ uint32 triggerSpell = aurEff->GetSpellEffectInfo().TriggerSpell;
+ int32 mod = int32(((float(aurEff->GetTickNumber()) / aurEff->GetTotalTicks()) * 0.9f + 0.1f) * 10000 * 2 / 3);
+ GetTarget()->CastSpell(nullptr, triggerSpell, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_RADIUS_MOD, mod));
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_broggok_poison_cloud::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
+ }
};
void AddSC_boss_broggok()
{
- new boss_broggok();
+ RegisterBloodFurnaceCreatureAI(boss_broggok);
RegisterBloodFurnaceCreatureAI(npc_nascent_fel_orc);
RegisterBloodFurnaceCreatureAI(npc_fel_orc_neophyte);
- new go_broggok_lever();
- new spell_broggok_poison_cloud();
+ RegisterBloodFurnaceGameObjectAI(go_broggok_lever);
+ RegisterSpellScript(spell_broggok_poison_cloud);
}
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
index b29fb0598ca..1a0bb7a8ba4 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_kelidan_the_breaker.cpp
@@ -15,6 +15,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/* Find a more elegant way to handle channelers */
+
#include "ScriptMgr.h"
#include "blood_furnace.h"
#include "ObjectAccessor.h"
@@ -22,354 +24,327 @@
#include "SpellAuras.h"
#include "TemporarySummon.h"
-enum Kelidan
+enum KelidanTexts
{
SAY_WAKE = 0,
- SAY_ADD_AGGRO = 1,
- SAY_KILL = 2,
- SAY_NOVA = 3,
- SAY_DIE = 4,
+ SAY_NOVA = 1,
+ SAY_SLAY = 2,
+ SAY_DEATH = 3,
+
+ SAY_AGGRO = 0
+};
+enum KelidanSpells
+{
SPELL_CORRUPTION = 30938,
SPELL_EVOCATION = 30935,
SPELL_FIRE_NOVA = 33132,
- H_SPELL_FIRE_NOVA = 37371,
+ SPELL_FIRE_NOVA_H = 37371,
SPELL_SHADOW_BOLT_VOLLEY = 28599,
- H_SPELL_SHADOW_BOLT_VOLLEY = 40070,
+ SPELL_SHADOW_BOLT_VOLLEY_H = 40070,
SPELL_BURNING_NOVA = 30940,
SPELL_VORTEX = 37370,
- ENTRY_KELIDAN = 17377,
- ENTRY_CHANNELER = 17653,
+ // Shadowmoon Channeler
+ SPELL_SHADOW_BOLT = 12739,
+ SPELL_SHADOW_BOLT_H = 15472,
- ACTION_ACTIVATE_ADDS = 92
+ SPELL_MARK_OF_SHADOW = 30937,
+ SPELL_CHANNELING = 39123
};
-const float ShadowmoonChannelers[5][4]=
+enum KelidanMisc
{
- {302.0f, -87.0f, -24.4f, 0.157f},
- {321.0f, -63.5f, -24.6f, 4.887f},
- {346.0f, -74.5f, -24.6f, 3.595f},
- {344.0f, -103.5f, -24.5f, 2.356f},
- {316.0f, -109.0f, -24.6f, 1.257f}
+ NPC_KELIDAN = 17377,
+ NPC_CHANNELER = 17653
};
-class boss_kelidan_the_breaker : public CreatureScript
+Position const ShadowmoonChannelers[5] =
{
- public:
- boss_kelidan_the_breaker() : CreatureScript("boss_kelidan_the_breaker") { }
+ { 301.988f, -86.7465f, -24.4517f, 0.15708f },
+ { 320.750f, -63.6121f, -24.6361f, 4.88692f },
+ { 345.848f, -74.4559f, -24.6402f, 3.59538f },
+ { 343.584f, -103.631f, -24.5688f, 2.35619f },
+ { 316.274f, -108.877f, -24.6027f, 1.25664f }
+};
- struct boss_kelidan_the_breakerAI : public BossAI
+// 17377 - Keli'dan the Breaker
+struct boss_kelidan_the_breaker : public BossAI
+{
+ boss_kelidan_the_breaker(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER)
+ {
+ Initialize();
+ Firenova_Timer = 0;
+ }
+
+ void Initialize()
+ {
+ ShadowVolley_Timer = 1000;
+ BurningNova_Timer = 15000;
+ Corruption_Timer = 5000;
+ check_Timer = 0;
+ Firenova = false;
+ }
+
+ uint32 ShadowVolley_Timer;
+ uint32 BurningNova_Timer;
+ uint32 Firenova_Timer;
+ uint32 Corruption_Timer;
+ uint32 check_Timer;
+ bool Firenova;
+ ObjectGuid Channelers[5];
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ SummonChannelers();
+ me->SetImmuneToNPC(true);
+ me->SetReactState(REACT_PASSIVE);
+ me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_WAKE);
+ if (me->IsNonMeleeSpellCast(false))
+ me->InterruptNonMeleeSpells(true);
+ DoStartMovement(who);
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ if (rand32() % 2)
+ return;
+
+ Talk(SAY_SLAY);
+ }
+
+ void ChannelerEngaged(Unit* who)
+ {
+ for (uint8 i = 0; i<5; ++i)
{
- boss_kelidan_the_breakerAI(Creature* creature) : BossAI(creature, DATA_KELIDAN_THE_BREAKER)
- {
- Initialize();
- Firenova_Timer = 0;
- }
-
- void Initialize()
- {
- ShadowVolley_Timer = 1000;
- BurningNova_Timer = 15000;
- Corruption_Timer = 5000;
- check_Timer = 0;
- Firenova = false;
- addYell = false;
- }
-
- uint32 ShadowVolley_Timer;
- uint32 BurningNova_Timer;
- uint32 Firenova_Timer;
- uint32 Corruption_Timer;
- uint32 check_Timer;
- bool Firenova;
- bool addYell;
- ObjectGuid Channelers[5];
-
- void Reset() override
- {
- _Reset();
- Initialize();
- SummonChannelers();
- me->SetReactState(REACT_PASSIVE);
- me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- me->SetImmuneToAll(true);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_WAKE);
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
- DoStartMovement(who);
- }
-
- void KilledUnit(Unit* /*victim*/) override
- {
- if (rand32() % 2)
- return;
-
- Talk(SAY_KILL);
- }
-
- void ChannelerEngaged(Unit* who)
- {
- if (who && !addYell)
- {
- addYell = true;
- Talk(SAY_ADD_AGGRO);
- }
- for (uint8 i = 0; i<5; ++i)
- {
- Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
- if (who && channeler && !channeler->IsInCombat())
- channeler->AI()->AttackStart(who);
- }
- }
+ Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
+ if (who && channeler && !channeler->IsInCombat())
+ channeler->AI()->AttackStart(who);
+ }
+ }
- void ChannelerDied(Unit* killer)
- {
- for (uint8 i = 0; i < 5; ++i)
- {
- Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
- if (channeler && channeler->IsAlive())
- return;
- }
- me->SetReactState(REACT_AGGRESSIVE);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- me->SetImmuneToAll(false);
- if (killer)
- AttackStart(killer);
- }
+ void ChannelerDied(Unit* killer)
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ {
+ Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
+ if (channeler && channeler->IsAlive())
+ return;
+ }
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->SetImmuneToNPC(false);
+ me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ if (killer)
+ AttackStart(killer);
+ }
+
+ ObjectGuid GetChanneled(Creature* channeler1)
+ {
+ SummonChannelers();
+ if (!channeler1)
+ return ObjectGuid::Empty;
+
+ uint8 i;
+ for (i = 0; i < 5; ++i)
+ {
+ Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
+ if (channeler && channeler->GetGUID() == channeler1->GetGUID())
+ break;
+ }
+ return Channelers[(i + 2) % 5];
+ }
- ObjectGuid GetChanneled(Creature* channeler1)
- {
- SummonChannelers();
- if (!channeler1)
- return ObjectGuid::Empty;
+ void SummonChannelers()
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ {
+ Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
+ if (!channeler || channeler->isDead())
+ channeler = me->SummonCreature(NPC_CHANNELER, ShadowmoonChannelers[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min);
+ if (channeler)
+ Channelers[i] = channeler->GetGUID();
+ else
+ Channelers[i].Clear();
+ }
+ }
- uint8 i;
- for (i = 0; i < 5; ++i)
- {
- Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
- if (channeler && channeler->GetGUID() == channeler1->GetGUID())
- break;
- }
- return Channelers[(i + 2) % 5];
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- void SummonChannelers()
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ {
+ if (check_Timer <= diff)
{
- for (uint8 i = 0; i < 5; ++i)
- {
- Creature* channeler = ObjectAccessor::GetCreature(*me, Channelers[i]);
- if (!channeler || channeler->isDead())
- channeler = me->SummonCreature(ENTRY_CHANNELER, ShadowmoonChannelers[i][0], ShadowmoonChannelers[i][1], ShadowmoonChannelers[i][2], ShadowmoonChannelers[i][3], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5min);
- if (channeler)
- Channelers[i] = channeler->GetGUID();
- else
- Channelers[i].Clear();
- }
+ if (!me->IsNonMeleeSpellCast(false))
+ DoCast(me, SPELL_EVOCATION);
+ check_Timer = 5000;
}
+ else
+ check_Timer -= diff;
+ return;
+ }
- void JustDied(Unit* /*killer*/) override
+ if (Firenova)
+ {
+ if (Firenova_Timer <= diff)
{
- _JustDied();
- Talk(SAY_DIE);
+ DoCast(me, SPELL_FIRE_NOVA, true);
+ Firenova = false;
+ ShadowVolley_Timer = 2000;
}
+ else
+ Firenova_Timer -=diff;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- {
- if (check_Timer <= diff)
- {
- if (!me->IsNonMeleeSpellCast(false))
- DoCast(me, SPELL_EVOCATION);
- check_Timer = 5000;
- }
- else
- check_Timer -= diff;
- return;
- }
-
- if (Firenova)
- {
- if (Firenova_Timer <= diff)
- {
- DoCast(me, SPELL_FIRE_NOVA, true);
- Firenova = false;
- ShadowVolley_Timer = 2000;
- }
- else
- Firenova_Timer -=diff;
-
- return;
- }
-
- if (ShadowVolley_Timer <= diff)
- {
- DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
- ShadowVolley_Timer = 5000 + rand32() % 8000;
- }
- else
- ShadowVolley_Timer -=diff;
-
- if (Corruption_Timer <= diff)
- {
- DoCast(me, SPELL_CORRUPTION);
- Corruption_Timer = 30000 + rand32() % 20000;
- }
- else
- Corruption_Timer -=diff;
+ return;
+ }
- if (BurningNova_Timer <= diff)
- {
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
+ if (ShadowVolley_Timer <= diff)
+ {
+ DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
+ ShadowVolley_Timer = 5000 + rand32() % 8000;
+ }
+ else
+ ShadowVolley_Timer -=diff;
- Talk(SAY_NOVA);
+ if (Corruption_Timer <= diff)
+ {
+ DoCast(me, SPELL_CORRUPTION);
+ Corruption_Timer = 30000 + rand32() % 20000;
+ }
+ else
+ Corruption_Timer -=diff;
- me->AddAura(SPELL_BURNING_NOVA, me);
+ if (BurningNova_Timer <= diff)
+ {
+ if (me->IsNonMeleeSpellCast(false))
+ me->InterruptNonMeleeSpells(true);
- if (IsHeroic())
- DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
+ Talk(SAY_NOVA);
- BurningNova_Timer = 20000 + rand32() % 8000;
- Firenova_Timer= 5000;
- Firenova = true;
- }
- else
- BurningNova_Timer -=diff;
+ me->AddAura(SPELL_BURNING_NOVA, me);
- DoMeleeAttackIfReady();
- }
- };
+ if (IsHeroic())
+ DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBloodFurnaceAI<boss_kelidan_the_breakerAI>(creature);
+ BurningNova_Timer = 20000 + rand32() % 8000;
+ Firenova_Timer= 5000;
+ Firenova = true;
}
-};
-
-/*######
-## npc_shadowmoon_channeler
-######*/
-
-enum Shadowmoon
-{
- SPELL_SHADOW_BOLT = 12739,
- H_SPELL_SHADOW_BOLT = 15472,
+ else
+ BurningNova_Timer -=diff;
- SPELL_MARK_OF_SHADOW = 30937,
- SPELL_CHANNELING = 39123
+ DoMeleeAttackIfReady();
+ }
};
-class npc_shadowmoon_channeler : public CreatureScript
+// 17653 - Shadowmoon Channeler
+struct npc_shadowmoon_channeler : public ScriptedAI
{
- public:
-
- npc_shadowmoon_channeler() : CreatureScript("npc_shadowmoon_channeler") { }
-
- struct npc_shadowmoon_channelerAI : public ScriptedAI
+ npc_shadowmoon_channeler(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ ShadowBolt_Timer = 1000 + rand32() % 1000;
+ MarkOfShadow_Timer = 5000 + rand32() % 2000;
+ check_Timer = 0;
+ }
+
+ uint32 ShadowBolt_Timer;
+ uint32 MarkOfShadow_Timer;
+ uint32 check_Timer;
+
+ void Reset() override
+ {
+ Initialize();
+ if (me->IsNonMeleeSpellCast(false))
+ me->InterruptNonMeleeSpells(true);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ Talk(SAY_AGGRO);
+
+ if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
+ ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerEngaged(who);
+ if (me->IsNonMeleeSpellCast(false))
+ me->InterruptNonMeleeSpells(true);
+ DoStartMovement(who);
+ }
+
+ void JustDied(Unit* killer) override
+ {
+ if (!killer)
+ return;
+
+ if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
+ ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->ChannelerDied(killer);
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
{
- npc_shadowmoon_channelerAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- }
-
- void Initialize()
- {
- ShadowBolt_Timer = 1000 + rand32() % 1000;
- MarkOfShadow_Timer = 5000 + rand32() % 2000;
- check_Timer = 0;
- }
-
- uint32 ShadowBolt_Timer;
- uint32 MarkOfShadow_Timer;
- uint32 check_Timer;
-
- void Reset() override
- {
- Initialize();
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
- }
-
- void JustEngagedWith(Unit* who) override
- {
- if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
- ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerEngaged(who);
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
- DoStartMovement(who);
- }
-
- void JustDied(Unit* killer) override
- {
- if (!killer)
- return;
-
- if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
- ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->ChannelerDied(killer);
- }
-
- void UpdateAI(uint32 diff) override
+ if (check_Timer <= diff)
{
- if (!UpdateVictim())
+ if (!me->IsNonMeleeSpellCast(false))
{
- if (check_Timer <= diff)
+ if (Creature* Kelidan = me->FindNearestCreature(NPC_KELIDAN, 100))
{
- if (!me->IsNonMeleeSpellCast(false))
- {
- if (Creature* Kelidan = me->FindNearestCreature(ENTRY_KELIDAN, 100))
- {
- ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker::boss_kelidan_the_breakerAI, Kelidan->AI())->GetChanneled(me);
- if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler))
- DoCast(channeled, SPELL_CHANNELING);
- }
- }
- check_Timer = 5000;
+ ObjectGuid channeler = ENSURE_AI(boss_kelidan_the_breaker, Kelidan->AI())->GetChanneled(me);
+ if (Unit* channeled = ObjectAccessor::GetUnit(*me, channeler))
+ DoCast(channeled, SPELL_CHANNELING);
}
- else
- check_Timer -= diff;
-
- return;
}
+ check_Timer = 5000;
+ }
+ else
+ check_Timer -= diff;
- if (MarkOfShadow_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_MARK_OF_SHADOW);
- MarkOfShadow_Timer = 15000 + rand32() % 5000;
- }
- else
- MarkOfShadow_Timer -=diff;
-
- if (ShadowBolt_Timer <= diff)
- {
- DoCastVictim(SPELL_SHADOW_BOLT);
- ShadowBolt_Timer = 5000 + rand32() % 1000;
- }
- else
- ShadowBolt_Timer -=diff;
+ return;
+ }
- DoMeleeAttackIfReady();
- }
- };
+ if (MarkOfShadow_Timer <= diff)
+ {
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_MARK_OF_SHADOW);
+ MarkOfShadow_Timer = 15000 + rand32() % 5000;
+ }
+ else
+ MarkOfShadow_Timer -=diff;
- CreatureAI* GetAI(Creature* creature) const override
+ if (ShadowBolt_Timer <= diff)
{
- return GetBloodFurnaceAI<npc_shadowmoon_channelerAI>(creature);
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ ShadowBolt_Timer = 5000 + rand32() % 1000;
}
+ else
+ ShadowBolt_Timer -=diff;
+
+ DoMeleeAttackIfReady();
+ }
};
void AddSC_boss_kelidan_the_breaker()
{
- new boss_kelidan_the_breaker();
- new npc_shadowmoon_channeler();
+ RegisterBloodFurnaceCreatureAI(boss_kelidan_the_breaker);
+ RegisterBloodFurnaceCreatureAI(npc_shadowmoon_channeler);
}
diff --git a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
index d310c4ccf7c..8a1106ed2b7 100644
--- a/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/BloodFurnace/boss_the_maker.cpp
@@ -19,14 +19,14 @@
#include "ScriptedCreature.h"
#include "blood_furnace.h"
-enum Yells
+enum MakerTexts
{
SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_DIE = 2
+ SAY_SLAY = 1,
+ SAY_DEATH = 2
};
-enum Spells
+enum MakerSpells
{
SPELL_ACID_SPRAY = 38153,
SPELL_EXPLODING_BREAKER = 30925,
@@ -34,7 +34,7 @@ enum Spells
SPELL_DOMINATION = 25772
};
-enum Events
+enum MakerEvents
{
EVENT_ACID_SPRAY = 1,
EVENT_EXPLODING_BREAKER,
@@ -42,73 +42,63 @@ enum Events
EVENT_KNOCKDOWN
};
-class boss_the_maker : public CreatureScript
+// 17381 - The Maker
+struct boss_the_maker : public BossAI
{
- public:
- boss_the_maker() : CreatureScript("boss_the_maker") { }
+ boss_the_maker(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { }
- struct boss_the_makerAI : public BossAI
- {
- boss_the_makerAI(Creature* creature) : BossAI(creature, DATA_THE_MAKER) { }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
-
- events.ScheduleEvent(EVENT_ACID_SPRAY, 15s);
- events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s);
- events.ScheduleEvent(EVENT_DOMINATION, 120s);
- events.ScheduleEvent(EVENT_KNOCKDOWN, 10s);
- }
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_KILL);
- }
+ events.ScheduleEvent(EVENT_ACID_SPRAY, 15s);
+ events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 6s);
+ events.ScheduleEvent(EVENT_DOMINATION, 120s);
+ events.ScheduleEvent(EVENT_KNOCKDOWN, 10s);
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DIE);
- }
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
- void ExecuteEvent(uint32 eventId) override
- {
- switch (eventId)
- {
- case EVENT_ACID_SPRAY:
- DoCastVictim(SPELL_ACID_SPRAY);
- events.ScheduleEvent(EVENT_ACID_SPRAY, 15s, 23s);
- break;
- case EVENT_EXPLODING_BREAKER:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
- DoCast(target, SPELL_EXPLODING_BREAKER);
- events.ScheduleEvent(EVENT_EXPLODING_BREAKER, 4s, 12s);
- break;
- case EVENT_DOMINATION:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
- DoCast(target, SPELL_DOMINATION);
- events.ScheduleEvent(EVENT_DOMINATION, 120s);
- break;
- case EVENT_KNOCKDOWN:
- DoCastVictim(SPELL_KNOCKDOWN);
- events.ScheduleEvent(EVENT_KNOCKDOWN, 4s, 12s);
- break;
- default:
- break;
- }
- }
- };
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
{
- return GetBloodFurnaceAI<boss_the_makerAI>(creature);
+ case EVENT_ACID_SPRAY:
+ DoCastVictim(SPELL_ACID_SPRAY);
+ events.Repeat(15s, 23s);
+ break;
+ case EVENT_EXPLODING_BREAKER:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true))
+ DoCast(target, SPELL_EXPLODING_BREAKER);
+ events.Repeat(4s, 12s);
+ break;
+ case EVENT_DOMINATION:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
+ DoCast(target, SPELL_DOMINATION);
+ events.Repeat(120s);
+ break;
+ case EVENT_KNOCKDOWN:
+ DoCastVictim(SPELL_KNOCKDOWN);
+ events.Repeat(4s, 12s);
+ break;
+ default:
+ break;
}
+ }
};
void AddSC_boss_the_maker()
{
- new boss_the_maker();
+ RegisterBloodFurnaceCreatureAI(boss_the_maker);
}