diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp | 488 | ||||
-rw-r--r-- | src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.h | 2 |
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_ |