diff options
| -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_  | 
