aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp488
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h2
2 files changed, 213 insertions, 277 deletions
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
index d82bae23626..6797ebd1005 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp
@@ -68,256 +68,212 @@ enum Misc
DATA_SOUL_POWER = 1
};
-class boss_bronjahm : public CreatureScript
+struct boss_bronjahm : public BossAI
{
- public:
- boss_bronjahm() : CreatureScript("boss_bronjahm") { }
-
- struct boss_bronjahmAI : public BossAI
+ boss_bronjahm(Creature* creature) : BossAI(creature, DATA_BRONJAHM)
+ {
+ DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ events.SetPhase(PHASE_1);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 2s);
+ events.ScheduleEvent(EVENT_MAGIC_BANE, 8s, 20s);
+ events.ScheduleEvent(EVENT_CORRUPT_SOUL, 25s, 35s, 0, PHASE_1);
+ }
+
+ void JustReachedHome() override
+ {
+ _JustReachedHome();
+ DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override
+ {
+ if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30))
{
- boss_bronjahmAI(Creature* creature) : BossAI(creature, DATA_BRONJAHM)
- {
- DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
- }
-
- void Reset() override
- {
- _Reset();
- events.SetPhase(PHASE_1);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 2s);
- events.ScheduleEvent(EVENT_MAGIC_BANE, 8s, 20s);
- events.ScheduleEvent(EVENT_CORRUPT_SOUL, 25s, 35s, 0, PHASE_1);
- }
+ events.SetPhase(PHASE_2);
+ DoCast(me, SPELL_TELEPORT);
+ events.ScheduleEvent(EVENT_FEAR, 12s, 16s, 0, PHASE_2);
+ events.ScheduleEvent(EVENT_SOULSTORM, 100ms, 0, PHASE_2);
+ }
+ }
- void JustReachedHome() override
- {
- _JustReachedHome();
- DoCast(me, SPELL_SOULSTORM_CHANNEL, true);
- }
+ void JustSummoned(Creature* summon) override
+ {
+ if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT)
+ {
+ summons.Summon(summon);
+ summon->SetReactState(REACT_PASSIVE);
+ summon->GetMotionMaster()->MoveFollow(me, me->GetCombatReach(), 0.0f);
+ summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true);
+ }
+ }
- void JustEngagedWith(Unit* who) override
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_SOUL_POWER)
+ {
+ uint32 count = 0;
+ for (ObjectGuid const& guid : summons)
{
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL);
+ if (Creature* summon = ObjectAccessor::GetCreature(*me, guid))
+ if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT && summon->IsAlive())
+ ++count;
}
+ return count;
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
+ return 0;
+ }
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) override
- {
- if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30))
- {
- events.SetPhase(PHASE_2);
- DoCast(me, SPELL_TELEPORT);
- events.ScheduleEvent(EVENT_FEAR, 12s, 16s, 0, PHASE_2);
- events.ScheduleEvent(EVENT_SOULSTORM, 100ms, 0, PHASE_2);
- }
- }
+ events.Update(diff);
- void JustSummoned(Creature* summon) override
- {
- if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT)
- {
- summons.Summon(summon);
- summon->SetReactState(REACT_PASSIVE);
- summon->GetMotionMaster()->MoveFollow(me, me->GetCombatReach(), 0.0f);
- summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true);
- }
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- uint32 GetData(uint32 type) const override
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (type == DATA_SOUL_POWER)
- {
- uint32 count = 0;
- for (ObjectGuid const& guid : summons)
+ case EVENT_MAGIC_BANE:
+ DoCastAOE(SPELL_MAGIC_S_BANE);
+ events.ScheduleEvent(EVENT_MAGIC_BANE, 8s, 20s);
+ break;
+ case EVENT_SHADOW_BOLT:
+ if (events.IsInPhase(PHASE_2))
{
- if (Creature* summon = ObjectAccessor::GetCreature(*me, guid))
- if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT && summon->IsAlive())
- ++count;
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 1s, 2s);
}
- return count;
- }
-
- return 0;
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ else
{
- case EVENT_MAGIC_BANE:
- DoCastAOE(SPELL_MAGIC_S_BANE);
- events.ScheduleEvent(EVENT_MAGIC_BANE, 8s, 20s);
- break;
- case EVENT_SHADOW_BOLT:
- if (events.IsInPhase(PHASE_2))
- {
- DoCastVictim(SPELL_SHADOW_BOLT);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 1s, 2s);
- }
- else
- {
- if (!me->IsWithinMeleeRange(me->GetVictim()))
- DoCastVictim(SPELL_SHADOW_BOLT);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 2s);
- }
- break;
- case EVENT_CORRUPT_SOUL:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
- {
- Talk(SAY_CORRUPT_SOUL);
- DoCast(target, SPELL_CORRUPT_SOUL);
- }
- events.ScheduleEvent(EVENT_CORRUPT_SOUL, 25s, 35s, 0, PHASE_1);
- break;
- case EVENT_SOULSTORM:
- Talk(SAY_SOUL_STORM);
- me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
- me->CastSpell(me, SPELL_SOULSTORM, false);
- break;
- case EVENT_FEAR:
- me->CastSpell(nullptr, SPELL_FEAR, { SPELLVALUE_MAX_TARGETS, 1 });
- events.ScheduleEvent(EVENT_FEAR, 8s, 12s, 0, PHASE_2);
- break;
- default:
- break;
+ if (!me->IsWithinMeleeRange(me->GetVictim()))
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ events.ScheduleEvent(EVENT_SHADOW_BOLT, 2s);
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- if (!events.IsInPhase(PHASE_2))
- DoMeleeAttackIfReady();
+ break;
+ case EVENT_CORRUPT_SOUL:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
+ {
+ Talk(SAY_CORRUPT_SOUL);
+ DoCast(target, SPELL_CORRUPT_SOUL);
+ }
+ events.ScheduleEvent(EVENT_CORRUPT_SOUL, 25s, 35s, 0, PHASE_1);
+ break;
+ case EVENT_SOULSTORM:
+ Talk(SAY_SOUL_STORM);
+ me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
+ me->CastSpell(me, SPELL_SOULSTORM, false);
+ break;
+ case EVENT_FEAR:
+ me->CastSpell(nullptr, SPELL_FEAR, { SPELLVALUE_MAX_TARGETS, 1 });
+ events.ScheduleEvent(EVENT_FEAR, 8s, 12s, 0, PHASE_2);
+ break;
+ default:
+ break;
}
- };
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetForgeOfSoulsAI<boss_bronjahmAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ if (!events.IsInPhase(PHASE_2))
+ DoMeleeAttackIfReady();
+ }
};
-class npc_corrupted_soul_fragment : public CreatureScript
+struct npc_corrupted_soul_fragment : public ScriptedAI
{
- public:
- npc_corrupted_soul_fragment() : CreatureScript("npc_corrupted_soul_fragment") { }
-
- struct npc_corrupted_soul_fragmentAI : public ScriptedAI
- {
- npc_corrupted_soul_fragmentAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = me->GetInstanceScript();
- }
-
- void IsSummonedBy(WorldObject* /*summoner*/) override
- {
- if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BRONJAHM)))
- bronjahm->AI()->JustSummoned(me);
- }
-
- void MovementInform(uint32 type, uint32 id) override
- {
- if (type != FOLLOW_MOTION_TYPE)
- return;
-
- if (instance->GetGuidData(DATA_BRONJAHM).GetCounter() != id)
- return;
-
- me->CastSpell(nullptr, SPELL_CONSUME_SOUL, true);
- me->DespawnOrUnsummon();
- }
-
- private:
- InstanceScript* instance;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetForgeOfSoulsAI<npc_corrupted_soul_fragmentAI>(creature);
- }
+ npc_corrupted_soul_fragment(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ }
+
+ void IsSummonedBy(WorldObject* /*summoner*/) override
+ {
+ if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BRONJAHM)))
+ bronjahm->AI()->JustSummoned(me);
+ }
+
+ void MovementInform(uint32 type, uint32 id) override
+ {
+ if (type != FOLLOW_MOTION_TYPE)
+ return;
+
+ if (instance->GetGuidData(DATA_BRONJAHM).GetCounter() != id)
+ return;
+
+ me->CastSpell(nullptr, SPELL_CONSUME_SOUL, true);
+ me->DespawnOrUnsummon();
+ }
+
+private:
+ InstanceScript* instance;
};
// 68793, 69050 - Magic's Bane
-class spell_bronjahm_magic_bane : public SpellScriptLoader
+class spell_bronjahm_magic_bane : public SpellScript
{
- public:
- spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { }
-
- class spell_bronjahm_magic_bane_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript);
-
- void RecalculateDamage(SpellEffIndex /*effIndex*/)
- {
- if (GetHitUnit()->GetPowerType() != POWER_MANA)
- return;
-
- int32 const maxDamage = GetCaster()->GetMap()->IsHeroic() ? 15000 : 10000;
- int32 newDamage = GetEffectValue() + (GetHitUnit()->GetMaxPower(POWER_MANA) / 2);
- SetEffectValue(std::min<int32>(maxDamage, newDamage));
- }
-
- void Register() override
- {
- OnEffectLaunchTarget += SpellEffectFn(spell_bronjahm_magic_bane_SpellScript::RecalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_bronjahm_magic_bane_SpellScript();
- }
+ PrepareSpellScript(spell_bronjahm_magic_bane);
+
+ void RecalculateDamage(SpellEffIndex /*effIndex*/)
+ {
+ if (GetHitUnit()->GetPowerType() != POWER_MANA)
+ return;
+
+ int32 const maxDamage = GetCaster()->GetMap()->IsHeroic() ? 15000 : 10000;
+ int32 newDamage = GetEffectValue() + (GetHitUnit()->GetMaxPower(POWER_MANA) / 2);
+ SetEffectValue(std::min<int32>(maxDamage, newDamage));
+ }
+
+ void Register() override
+ {
+ OnEffectLaunchTarget += SpellEffectFn(spell_bronjahm_magic_bane::RecalculateDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
};
// 68861 - Consume Soul
-class spell_bronjahm_consume_soul : public SpellScriptLoader
+class spell_bronjahm_consume_soul : public SpellScript
{
- public:
- spell_bronjahm_consume_soul() : SpellScriptLoader("spell_bronjahm_consume_soul") { }
-
- class spell_bronjahm_consume_soul_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_bronjahm_consume_soul_SpellScript);
-
- void HandleScript(SpellEffIndex effIndex)
- {
- PreventHitDefaultEffect(effIndex);
- GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_bronjahm_consume_soul_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_bronjahm_consume_soul_SpellScript();
- }
+ PrepareSpellScript(spell_bronjahm_consume_soul);
+
+ void HandleScript(SpellEffIndex effIndex)
+ {
+ PreventHitDefaultEffect(effIndex);
+ GetHitUnit()->CastSpell(GetHitUnit(), GetEffectValue(), true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_bronjahm_consume_soul::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
static uint32 const SoulstormVisualSpells[] =
@@ -332,62 +288,40 @@ static uint32 const SoulstormVisualSpells[] =
68898
};
-class spell_bronjahm_soulstorm_visual : public SpellScriptLoader
+class spell_bronjahm_soulstorm_visual : public AuraScript
{
- public:
- spell_bronjahm_soulstorm_visual(char const* scriptName) : SpellScriptLoader(scriptName) { }
-
- class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_bronjahm_soulstorm_visual_AuraScript);
-
- void HandlePeriodicTick(AuraEffect const* aurEff)
- {
- PreventDefaultAction();
- GetTarget()->CastSpell(GetTarget(), SoulstormVisualSpells[aurEff->GetTickNumber() % 8], true);
- }
-
- void Register() override
- {
- OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_bronjahm_soulstorm_visual_AuraScript();
- }
+ PrepareAuraScript(spell_bronjahm_soulstorm_visual);
+
+ void HandlePeriodicTick(AuraEffect const* aurEff)
+ {
+ PreventDefaultAction();
+ GetTarget()->CastSpell(GetTarget(), SoulstormVisualSpells[aurEff->GetTickNumber() % 8], true);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
};
// 68921, 69049 - Soulstorm
-class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader
+class spell_bronjahm_soulstorm_targeting : public SpellScript
{
- public:
- spell_bronjahm_soulstorm_targeting() : SpellScriptLoader("spell_bronjahm_soulstorm_targeting") { }
-
- class spell_bronjahm_soulstorm_targeting_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_bronjahm_soulstorm_targeting_SpellScript);
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- Unit* caster = GetCaster();
- targets.remove_if([caster](WorldObject* target)
- {
- return caster->GetExactDist2d(target) <= 10.0f;
- });
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY);
- }
- };
+ PrepareSpellScript(spell_bronjahm_soulstorm_targeting);
- SpellScript* GetSpellScript() const override
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ Unit* caster = GetCaster();
+ targets.remove_if([caster](WorldObject* target)
{
- return new spell_bronjahm_soulstorm_targeting_SpellScript();
- }
+ return caster->GetExactDist2d(target) <= 10.0f;
+ });
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY);
+ }
};
class achievement_bronjahm_soul_power : public AchievementCriteriaScript
@@ -403,12 +337,12 @@ class achievement_bronjahm_soul_power : public AchievementCriteriaScript
void AddSC_boss_bronjahm()
{
- new boss_bronjahm();
- new npc_corrupted_soul_fragment();
- new spell_bronjahm_magic_bane();
- new spell_bronjahm_consume_soul();
- new spell_bronjahm_soulstorm_visual("spell_bronjahm_soulstorm_channel");
- new spell_bronjahm_soulstorm_visual("spell_bronjahm_soulstorm_visual");
- new spell_bronjahm_soulstorm_targeting();
- new achievement_bronjahm_soul_power();
+ RegisterForgeOfSoulsCreatureAI(boss_bronjahm);
+ RegisterForgeOfSoulsCreatureAI(npc_corrupted_soul_fragment);
+ RegisterSpellScript(spell_bronjahm_magic_bane);
+ RegisterSpellScript(spell_bronjahm_consume_soul);
+ RegisterSpellScriptWithArgs(spell_bronjahm_soulstorm_visual, "spell_bronjahm_soulstorm_channel");
+ RegisterSpellScriptWithArgs(spell_bronjahm_soulstorm_visual, "spell_bronjahm_soulstorm_visual");
+ RegisterSpellScript(spell_bronjahm_soulstorm_targeting);
+ RegisterSpellScript(achievement_bronjahm_soul_power);
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
index f1338736e6b..33c2017de49 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h
@@ -63,4 +63,6 @@ inline AI* GetForgeOfSoulsAI(T* obj)
return GetInstanceAI<AI>(obj, FoSScriptName);
}
+#define RegisterForgeOfSoulsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetForgeOfSoulsAI)
+
#endif // FORGE_OF_SOULS_H_