diff options
| author | offl <11556157+offl@users.noreply.github.com> | 2021-07-15 01:55:10 +0300 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-03-11 17:04:41 +0100 | 
| commit | c3c4571946fffc2a7dc2a419d5477e46bd01a229 (patch) | |
| tree | dea19c8f8c191eaa16171cfad28ec2be8e2196f5 /src/server/scripts/Northrend | |
| parent | 77f03727a5cb695de799c92e37ed55d6f8ff60a3 (diff) | |
Scripts/FoS: Update remaining scripts to new register model (#26700)
(cherry picked from commit 24bd519f5ccbf444434aec50e956d8a904dac4c8)
Diffstat (limited to 'src/server/scripts/Northrend')
| -rw-r--r-- | src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp | 572 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp | 312 | 
2 files changed, 412 insertions, 472 deletions
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index 78596972c7d..74ccee2dd8d 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -124,351 +124,307 @@ enum Misc      DATA_THREE_FACED                = 1  }; -class boss_devourer_of_souls : public CreatureScript +struct boss_devourer_of_souls : public BossAI  { -    public: -        boss_devourer_of_souls() : CreatureScript("boss_devourer_of_souls") { } - -        struct boss_devourer_of_soulsAI : public BossAI +    boss_devourer_of_souls(Creature* creature) : BossAI(creature, DATA_DEVOURER_OF_SOULS) +    { +        Initialize(); +        beamAngle = 0.f; +        beamAngleDiff = 0.f; +        wailingSoulTick = 0; +    } + +    void Initialize() +    { +        threeFaced = true; +    } + +    void Reset() override +    { +        _Reset(); +        me->SetControlled(false, UNIT_STATE_ROOT); +        me->SetDisplayId(DISPLAY_ANGER); +        me->SetReactState(REACT_AGGRESSIVE); + +        Initialize(); +    } + +    void JustEngagedWith(Unit* who) override +    { +        BossAI::JustEngagedWith(who); +        Talk(SAY_FACE_AGGRO); + +        if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 60)) // Prevent double spawn +            instance->instance->SummonCreature(NPC_CRUCIBLE_OF_SOULS, CrucibleSummonPos); +        events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s); +        events.ScheduleEvent(EVENT_MIRRORED_SOUL, 8s); +        events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30s); +        events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20s); +        events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s); +    } + +    void KilledUnit(Unit* victim) override +    { +        if (victim->GetTypeId() != TYPEID_PLAYER) +            return; + +        uint8 textId = 0; +        switch (me->GetDisplayId())          { -            boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_OF_SOULS) -            { -                Initialize(); -                beamAngle = 0.f; -                beamAngleDiff = 0.f; -                wailingSoulTick = 0; -            } +            case DISPLAY_ANGER: +                textId = SAY_FACE_ANGER_SLAY; +                break; +            case DISPLAY_SORROW: +                textId = SAY_FACE_SORROW_SLAY; +                break; +            case DISPLAY_DESIRE: +                textId = SAY_FACE_DESIRE_SLAY; +                break; +            default: +                break; +        } -            void Initialize() -            { -                threeFaced = true; -            } +        if (textId) +            Talk(textId); +    } -            void Reset() override -            { -                _Reset(); -                me->SetControlled(false, UNIT_STATE_ROOT); -                me->SetDisplayId(DISPLAY_ANGER); -                me->SetReactState(REACT_AGGRESSIVE); +    void JustDied(Unit* /*killer*/) override +    { +        _JustDied(); -                Initialize(); -            } +        Position spawnPoint = {5618.139f, 2451.873f, 705.854f, 0}; -            void JustEngagedWith(Unit* who) override -            { -                BossAI::JustEngagedWith(who); -                Talk(SAY_FACE_AGGRO); - -                if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 60)) // Prevent double spawn -                    me->GetMap()->SummonCreature(NPC_CRUCIBLE_OF_SOULS, CrucibleSummonPos); -                events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s); -                events.ScheduleEvent(EVENT_MIRRORED_SOUL, 8s); -                events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30s); -                events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20s); -                events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s); -            } +        Talk(SAY_FACE_DEATH); -            void KilledUnit(Unit* victim) override +        int32 entryIndex; +        if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) +            entryIndex = 0; +        else +            entryIndex = 1; + +        for (int8 i = 0; outroPositions[i].entry[entryIndex] != 0; ++i) +        { +            if (TempSummon* summon = instance->instance->SummonCreature(outroPositions[i].entry[entryIndex], spawnPoint))              { -                if (victim->GetTypeId() != TYPEID_PLAYER) -                    return; - -                uint8 textId = 0; -                switch (me->GetDisplayId()) -                { -                    case DISPLAY_ANGER: -                        textId = SAY_FACE_ANGER_SLAY; -                        break; -                    case DISPLAY_SORROW: -                        textId = SAY_FACE_SORROW_SLAY; -                        break; -                    case DISPLAY_DESIRE: -                        textId = SAY_FACE_DESIRE_SLAY; -                        break; -                    default: -                        break; -                } - -                if (textId) -                    Talk(textId); +                summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); +                summon->GetMotionMaster()->MovePoint(0, outroPositions[i].movePosition); +                if (summon->GetEntry() == NPC_JAINA_PART2) +                    summon->AI()->Talk(SAY_JAINA_OUTRO); +                else if (summon->GetEntry() == NPC_SYLVANAS_PART2) +                    summon->AI()->Talk(SAY_SYLVANAS_OUTRO);              } +        } +    } -            void JustDied(Unit* /*killer*/) override -            { -                _JustDied(); +    void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override +    { +        if (spellInfo->Id == H_SPELL_PHANTOM_BLAST) +            threeFaced = false; +    } + +    uint32 GetData(uint32 type) const override +    { +        if (type == DATA_THREE_FACED) +            return threeFaced; + +        return 0; +    } -                Position spawnPoint = {5618.139f, 2451.873f, 705.854f, 0}; +    void UpdateAI(uint32 diff) override +    { +        // Return since we have no target +        if (!UpdateVictim()) +            return; -                Talk(SAY_FACE_DEATH); +        events.Update(diff); -                int32 entryIndex; -                if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE) -                    entryIndex = 0; -                else -                    entryIndex = 1; +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; -                for (int8 i = 0; outroPositions[i].entry[entryIndex] != 0; ++i) -                { -                    if (TempSummon* summon = instance->instance->SummonCreature(outroPositions[i].entry[entryIndex], spawnPoint)) +        while (uint32 eventId = events.ExecuteEvent()) +        { +            switch (eventId) +            { +                case EVENT_PHANTOM_BLAST: +                    DoCastVictim(SPELL_PHANTOM_BLAST); +                    events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s); +                    break; +                case EVENT_MIRRORED_SOUL: +                    DoCastAOE(SPELL_MIRRORED_SOUL_TARGET_SELECTOR); +                    Talk(EMOTE_MIRRORED_SOUL); +                    events.ScheduleEvent(EVENT_MIRRORED_SOUL, 15s, 30s); +                    break; +                case EVENT_WELL_OF_SOULS: +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) +                        DoCast(target, SPELL_WELL_OF_SOULS); +                    events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20s); +                    break; +                case EVENT_UNLEASHED_SOULS: +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) +                        DoCast(target, SPELL_UNLEASHED_SOULS); +                    me->SetDisplayId(DISPLAY_SORROW); +                    Talk(SAY_FACE_UNLEASH_SOUL); +                    Talk(EMOTE_UNLEASH_SOUL); +                    events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30s); +                    events.ScheduleEvent(EVENT_FACE_ANGER, 5s); +                    break; +                case EVENT_FACE_ANGER: +                    me->SetDisplayId(DISPLAY_ANGER); +                    break; + +                case EVENT_WAILING_SOULS: +                    me->SetDisplayId(DISPLAY_DESIRE); +                    Talk(SAY_FACE_WAILING_SOUL); +                    Talk(EMOTE_WAILING_SOUL); +                    DoCast(me, SPELL_WAILING_SOULS_STARTING); +                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))                      { -                        summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN); -                        summon->GetMotionMaster()->MovePoint(0, outroPositions[i].movePosition); -                        if (summon->GetEntry() == NPC_JAINA_PART2) -                            summon->AI()->Talk(SAY_JAINA_OUTRO); -                        else if (summon->GetEntry() == NPC_SYLVANAS_PART2) -                            summon->AI()->Talk(SAY_SYLVANAS_OUTRO); +                        me->SetFacingToObject(target); +                        DoCast(me, SPELL_WAILING_SOULS_BEAM);                      } -                } -            } -            void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override -            { -                if (spellInfo->Id == H_SPELL_PHANTOM_BLAST) -                    threeFaced = false; -            } +                    beamAngle = me->GetOrientation(); -            uint32 GetData(uint32 type) const override -            { -                if (type == DATA_THREE_FACED) -                    return threeFaced; +                    beamAngleDiff = float(M_PI)/30.0f; // PI/2 in 15 sec = PI/30 per tick +                    if (RAND(true, false)) +                        beamAngleDiff = -beamAngleDiff; -                return 0; -            } +                    me->InterruptNonMeleeSpells(false); +                    me->SetReactState(REACT_PASSIVE); -            void UpdateAI(uint32 diff) override -            { -                // Return since we have no target -                if (!UpdateVictim()) -                    return; +                    //Remove any target +                    me->SetTarget(ObjectGuid::Empty); -                events.Update(diff); +                    me->GetMotionMaster()->Clear(); +                    me->SetControlled(true, UNIT_STATE_ROOT); -                if (me->HasUnitState(UNIT_STATE_CASTING)) -                    return; +                    wailingSoulTick = 15; +                    events.DelayEvents(18s); // no other events during wailing souls +                    events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3s); // first one after 3 secs. +                    break; -                while (uint32 eventId = events.ExecuteEvent()) -                { -                    switch (eventId) -                    { -                        case EVENT_PHANTOM_BLAST: -                            DoCastVictim(SPELL_PHANTOM_BLAST); -                            events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s); -                            break; -                        case EVENT_MIRRORED_SOUL: -                            DoCastAOE(SPELL_MIRRORED_SOUL_TARGET_SELECTOR); -                            Talk(EMOTE_MIRRORED_SOUL); -                            events.ScheduleEvent(EVENT_MIRRORED_SOUL, 15s, 30s); -                            break; -                        case EVENT_WELL_OF_SOULS: -                            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) -                                DoCast(target, SPELL_WELL_OF_SOULS); -                            events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20s); -                            break; -                        case EVENT_UNLEASHED_SOULS: -                            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) -                                DoCast(target, SPELL_UNLEASHED_SOULS); -                            me->SetDisplayId(DISPLAY_SORROW); -                            Talk(SAY_FACE_UNLEASH_SOUL); -                            Talk(EMOTE_UNLEASH_SOUL); -                            events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30s); -                            events.ScheduleEvent(EVENT_FACE_ANGER, 5s); -                            break; -                        case EVENT_FACE_ANGER: -                            me->SetDisplayId(DISPLAY_ANGER); -                            break; - -                        case EVENT_WAILING_SOULS: -                            me->SetDisplayId(DISPLAY_DESIRE); -                            Talk(SAY_FACE_WAILING_SOUL); -                            Talk(EMOTE_WAILING_SOUL); -                            DoCast(me, SPELL_WAILING_SOULS_STARTING); -                            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) -                            { -                                me->SetFacingToObject(target); -                                DoCast(me, SPELL_WAILING_SOULS_BEAM); -                            } - -                            beamAngle = me->GetOrientation(); - -                            beamAngleDiff = float(M_PI)/30.0f; // PI/2 in 15 sec = PI/30 per tick -                            if (RAND(true, false)) -                                beamAngleDiff = -beamAngleDiff; - -                            me->InterruptNonMeleeSpells(false); -                            me->SetReactState(REACT_PASSIVE); - -                            //Remove any target -                            me->SetTarget(ObjectGuid::Empty); - -                            me->GetMotionMaster()->Clear(); -                            me->SetControlled(true, UNIT_STATE_ROOT); - -                            wailingSoulTick = 15; -                            events.DelayEvents(18s); // no other events during wailing souls -                            events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3s); // first one after 3 secs. -                            break; - -                        case EVENT_WAILING_SOULS_TICK: -                            beamAngle += beamAngleDiff; -                            me->SetFacingTo(beamAngle); - -                            DoCast(me, SPELL_WAILING_SOULS); - -                            if (--wailingSoulTick) -                                events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1s); -                            else -                            { -                                me->SetReactState(REACT_AGGRESSIVE); -                                me->SetDisplayId(DISPLAY_ANGER); -                                me->SetControlled(false, UNIT_STATE_ROOT); -                                me->GetMotionMaster()->MoveChase(me->GetVictim()); -                                events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s); -                            } -                            break; -                    } +                case EVENT_WAILING_SOULS_TICK: +                    beamAngle += beamAngleDiff; +                    me->SetFacingTo(beamAngle); -                    if (me->HasUnitState(UNIT_STATE_CASTING)) -                        return; -                } +                    DoCast(me, SPELL_WAILING_SOULS); -                DoMeleeAttackIfReady(); +                    if (--wailingSoulTick) +                        events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1s); +                    else +                    { +                        me->SetReactState(REACT_AGGRESSIVE); +                        me->SetDisplayId(DISPLAY_ANGER); +                        me->SetControlled(false, UNIT_STATE_ROOT); +                        me->GetMotionMaster()->MoveChase(me->GetVictim()); +                        events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s); +                    } +                    break;              } -        private: -            bool threeFaced; +            if (me->HasUnitState(UNIT_STATE_CASTING)) +                return; +        } -            // wailing soul event -            float beamAngle; -            float beamAngleDiff; -            int8 wailingSoulTick; -        }; +        DoMeleeAttackIfReady(); +    } -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetForgeOfSoulsAI<boss_devourer_of_soulsAI>(creature); -        } +private: +    bool threeFaced; + +    // wailing soul event +    float beamAngle; +    float beamAngleDiff; +    int8 wailingSoulTick;  };  // 69051 - Mirrored Soul -class spell_devourer_of_souls_mirrored_soul : public SpellScriptLoader +class spell_devourer_of_souls_mirrored_soul : public SpellScript  { -    public: -        spell_devourer_of_souls_mirrored_soul() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul") { } - -        class spell_devourer_of_souls_mirrored_soul_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_SpellScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_PROC_AURA }); -            } - -            void HandleScript(SpellEffIndex /*effIndex*/) -            { -                if (Unit* target = GetHitUnit()) -                    target->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_PROC_AURA, true); -            } - -            void Register() override -            { -                OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_devourer_of_souls_mirrored_soul_SpellScript(); -        } +    PrepareSpellScript(spell_devourer_of_souls_mirrored_soul); + +    bool Validate(SpellInfo const* /*spellInfo*/) override +    { +        return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_PROC_AURA }); +    } + +    void HandleScript(SpellEffIndex /*effIndex*/) +    { +        if (Unit* target = GetHitUnit()) +            target->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_PROC_AURA, true); +    } + +    void Register() override +    { +        OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +    }  };  // 69023 - Mirrored Soul (Proc) -class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader +class spell_devourer_of_souls_mirrored_soul_proc : public AuraScript  { -    public: -        spell_devourer_of_souls_mirrored_soul_proc() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul_proc") { } - -        class spell_devourer_of_souls_mirrored_soul_proc_AuraScript : public AuraScript -        { -            PrepareAuraScript(spell_devourer_of_souls_mirrored_soul_proc_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_DAMAGE }); -            } - -            bool CheckProc(ProcEventInfo& /*eventInfo*/) -            { -                return GetCaster() && GetCaster()->IsAlive(); -            } - -            void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo) -            { -                PreventDefaultAction(); -                DamageInfo* damageInfo = eventInfo.GetDamageInfo(); -                if (!damageInfo || !damageInfo->GetDamage()) -                    return; - -                CastSpellExtraArgs args(TRIGGERED_FULL_MASK); -                args.AddSpellMod(SPELLVALUE_BASE_POINT0, CalculatePct(damageInfo->GetDamage(), 45)); -                GetTarget()->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_DAMAGE, args); -            } - -            void Register() override -            { -                DoCheckProc += AuraCheckProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::CheckProc); -                OnEffectProc += AuraEffectProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); -            } -        }; - -        AuraScript* GetAuraScript() const override -        { -            return new spell_devourer_of_souls_mirrored_soul_proc_AuraScript(); -        } +    PrepareAuraScript(spell_devourer_of_souls_mirrored_soul_proc); + +    bool Validate(SpellInfo const* /*spellInfo*/) override +    { +        return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_DAMAGE }); +    } + +    bool CheckProc(ProcEventInfo& /*eventInfo*/) +    { +        return GetCaster() && GetCaster()->IsAlive(); +    } + +    void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo) +    { +        PreventDefaultAction(); +        DamageInfo* damageInfo = eventInfo.GetDamageInfo(); +        if (!damageInfo || !damageInfo->GetDamage()) +            return; + +        CastSpellExtraArgs args(TRIGGERED_FULL_MASK); +        args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), 45)); +        GetTarget()->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_DAMAGE, args); +    } + +    void Register() override +    { +        DoCheckProc += AuraCheckProcFn(spell_devourer_of_souls_mirrored_soul_proc::CheckProc); +        OnEffectProc += AuraEffectProcFn(spell_devourer_of_souls_mirrored_soul_proc::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); +    }  };  // 69048 - Mirrored Soul (Target Selector) -class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScriptLoader +class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScript  { -    public: -        spell_devourer_of_souls_mirrored_soul_target_selector() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul_target_selector") { } - -        class spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript : public SpellScript -        { -            PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) override -            { -                return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_BUFF }); -            } - -            void FilterTargets(std::list<WorldObject*>& targets) -            { -                if (targets.empty()) -                    return; - -                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); -                targets.clear(); -                targets.push_back(target); -            } - -            void HandleScript(SpellEffIndex /*effIndex*/) -            { -                if (Unit* target = GetHitUnit()) -                    GetCaster()->CastSpell(target, SPELL_MIRRORED_SOUL_BUFF, false); -            } - -            void Register() override -            { -                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); -                OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); -            } -        }; - -        SpellScript* GetSpellScript() const override -        { -            return new spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript(); -        } +    PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector); + +    bool Validate(SpellInfo const* /*spellInfo*/) override +    { +        return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_BUFF }); +    } + +    void FilterTargets(std::list<WorldObject*>& targets) +    { +        if (targets.empty()) +            return; + +        WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); +        targets.clear(); +        targets.push_back(target); +    } + +    void HandleScript(SpellEffIndex /*effIndex*/) +    { +        if (Unit* target = GetHitUnit()) +            GetCaster()->CastSpell(target, SPELL_MIRRORED_SOUL_BUFF, false); +    } + +    void Register() override +    { +        OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_devourer_of_souls_mirrored_soul_target_selector::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); +        OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_target_selector::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +    }  };  class achievement_three_faced : public AchievementCriteriaScript @@ -491,9 +447,9 @@ class achievement_three_faced : public AchievementCriteriaScript  void AddSC_boss_devourer_of_souls()  { -    new boss_devourer_of_souls(); -    new spell_devourer_of_souls_mirrored_soul(); -    new spell_devourer_of_souls_mirrored_soul_proc(); -    new spell_devourer_of_souls_mirrored_soul_target_selector(); +    RegisterForgeOfSoulsCreatureAI(boss_devourer_of_souls); +    RegisterSpellScript(spell_devourer_of_souls_mirrored_soul); +    RegisterSpellScript(spell_devourer_of_souls_mirrored_soul_proc); +    RegisterSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector);      new achievement_three_faced();  } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index ea22c7acbad..f5262706cb5 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -75,204 +75,188 @@ enum ForgeSpells      SPELL_LETHARGY = 69133  }; -class npc_sylvanas_fos : public CreatureScript +struct npc_sylvanas_fos : public ScriptedAI  { -public: -    npc_sylvanas_fos() : CreatureScript("npc_sylvanas_fos") { } +    npc_sylvanas_fos(Creature* creature) : ScriptedAI(creature) +    { +        Initialize(); +        instance = me->GetInstanceScript(); +        me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); +    } -    struct npc_sylvanas_fosAI : public ScriptedAI +    void Initialize()      { -        npc_sylvanas_fosAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -            me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); -        } +        phase = PHASE_NORMAL; +    } -        void Initialize() -        { -            phase = PHASE_NORMAL; -        } +    InstanceScript* instance; -        EventMap events; -        Phase phase; +    EventMap events; +    Phase phase; -        void Reset() override +    void Reset() override +    { +        events.Reset(); +        Initialize(); +    } + +    bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override +    { +        if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID)          { +            CloseGossipMenuFor(player); +            phase = PHASE_INTRO; +            me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);              events.Reset(); -            Initialize(); +            events.ScheduleEvent(EVENT_INTRO_1, 1s);          } +        return false; +    } -        bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override +    void UpdateAI(uint32 diff) override +    { +        if (phase == PHASE_INTRO)          { -            if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID) +            events.Update(diff); +            switch (events.ExecuteEvent())              { -                CloseGossipMenuFor(player); -                phase = PHASE_INTRO; -                me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); -                events.Reset(); -                events.ScheduleEvent(EVENT_INTRO_1, 1s); +                case EVENT_INTRO_1: +                    Talk(SAY_SYLVANAS_INTRO_1); +                    events.ScheduleEvent(EVENT_INTRO_2, 11500ms); +                    break; + +                case EVENT_INTRO_2: +                    Talk(SAY_SYLVANAS_INTRO_2); +                    events.ScheduleEvent(EVENT_INTRO_3, 10500ms); +                    break; + +                case EVENT_INTRO_3: +                    Talk(SAY_SYLVANAS_INTRO_3); +                    events.ScheduleEvent(EVENT_INTRO_4, 9500ms); +                    break; + +                case EVENT_INTRO_4: +                    Talk(SAY_SYLVANAS_INTRO_4); +                    events.ScheduleEvent(EVENT_INTRO_5, 10500ms); +                    break; + +                case EVENT_INTRO_5: +                    Talk(SAY_SYLVANAS_INTRO_5); +                    events.ScheduleEvent(EVENT_INTRO_6, 9500ms); +                    break; + +                case EVENT_INTRO_6: +                    Talk(SAY_SYLVANAS_INTRO_6); +                    // End of Intro +                    phase = PHASE_NORMAL; +                    break;              } -            return false;          } -        void UpdateAI(uint32 diff) override -        { -            if (phase == PHASE_INTRO) -            { -                events.Update(diff); -                switch (events.ExecuteEvent()) -                { -                    case EVENT_INTRO_1: -                        Talk(SAY_SYLVANAS_INTRO_1); -                        events.ScheduleEvent(EVENT_INTRO_2, 11500ms); -                        break; - -                    case EVENT_INTRO_2: -                        Talk(SAY_SYLVANAS_INTRO_2); -                        events.ScheduleEvent(EVENT_INTRO_3, 10500ms); -                        break; - -                    case EVENT_INTRO_3: -                        Talk(SAY_SYLVANAS_INTRO_3); -                        events.ScheduleEvent(EVENT_INTRO_4, 9500ms); -                        break; - -                    case EVENT_INTRO_4: -                        Talk(SAY_SYLVANAS_INTRO_4); -                        events.ScheduleEvent(EVENT_INTRO_5, 10500ms); -                        break; - -                    case EVENT_INTRO_5: -                        Talk(SAY_SYLVANAS_INTRO_5); -                        events.ScheduleEvent(EVENT_INTRO_6, 9500ms); -                        break; - -                    case EVENT_INTRO_6: -                        Talk(SAY_SYLVANAS_INTRO_6); -                        // End of Intro -                        phase = PHASE_NORMAL; -                        break; -                } -            } +        //Return since we have no target +        if (!UpdateVictim()) +            return; -            //Return since we have no target -            if (!UpdateVictim()) -                return; - -            events.Update(diff); -            DoMeleeAttackIfReady(); -        } -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetForgeOfSoulsAI<npc_sylvanas_fosAI>(creature); +        events.Update(diff); +        DoMeleeAttackIfReady();      }  }; -class npc_jaina_fos : public CreatureScript +struct npc_jaina_fos: public ScriptedAI  { -public: -    npc_jaina_fos() : CreatureScript("npc_jaina_fos") { } +    npc_jaina_fos(Creature* creature) : ScriptedAI(creature) +    { +        Initialize(); +        instance = me->GetInstanceScript(); +        me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); +    } -    struct npc_jaina_fosAI: public ScriptedAI +    void Initialize()      { -        npc_jaina_fosAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -            me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); -        } +        phase = PHASE_NORMAL; +    } -        void Initialize() -        { -            phase = PHASE_NORMAL; -        } +    InstanceScript* instance; -        EventMap events; -        Phase phase; +    EventMap events; +    Phase phase; -        void Reset() override +    void Reset() override +    { +        events.Reset(); +        Initialize(); +    } + +    bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override +    { +        if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID)          { +            CloseGossipMenuFor(player); +            phase = PHASE_INTRO; +            me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);              events.Reset(); -            Initialize(); +            events.ScheduleEvent(EVENT_INTRO_1, 1s);          } +        return false; +    } -        bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override +    void UpdateAI(uint32 diff) override +    { +        if (phase == PHASE_INTRO)          { -            if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID) +            events.Update(diff); +            switch (events.ExecuteEvent())              { -                CloseGossipMenuFor(player); -                phase = PHASE_INTRO; -                me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); -                events.Reset(); -                events.ScheduleEvent(EVENT_INTRO_1, 1s); +                case EVENT_INTRO_1: +                    Talk(SAY_JAINA_INTRO_1); +                    events.ScheduleEvent(EVENT_INTRO_2, 8s); +                    break; + +                case EVENT_INTRO_2: +                    Talk(SAY_JAINA_INTRO_2); +                    events.ScheduleEvent(EVENT_INTRO_3, 8500ms); +                    break; + +                case EVENT_INTRO_3: +                    Talk(SAY_JAINA_INTRO_3); +                    events.ScheduleEvent(EVENT_INTRO_4, 8s); +                    break; + +                case EVENT_INTRO_4: +                    Talk(SAY_JAINA_INTRO_4); +                    events.ScheduleEvent(EVENT_INTRO_5, 10s); +                    break; + +                case EVENT_INTRO_5: +                    Talk(SAY_JAINA_INTRO_5); +                    events.ScheduleEvent(EVENT_INTRO_6, 8s); +                    break; + +                case EVENT_INTRO_6: +                    Talk(SAY_JAINA_INTRO_6); +                    events.ScheduleEvent(EVENT_INTRO_7, 12s); +                    break; + +                case EVENT_INTRO_7: +                    Talk(SAY_JAINA_INTRO_7); +                    events.ScheduleEvent(EVENT_INTRO_8, 8s); +                    break; + +                case EVENT_INTRO_8: +                    Talk(SAY_JAINA_INTRO_8); +                    // End of Intro +                    phase = PHASE_NORMAL; +                    break;              } -            return false;          } -        void UpdateAI(uint32 diff) override -        { -            if (phase == PHASE_INTRO) -            { -                events.Update(diff); -                switch (events.ExecuteEvent()) -                { -                    case EVENT_INTRO_1: -                        Talk(SAY_JAINA_INTRO_1); -                        events.ScheduleEvent(EVENT_INTRO_2, 8s); -                        break; - -                    case EVENT_INTRO_2: -                        Talk(SAY_JAINA_INTRO_2); -                        events.ScheduleEvent(EVENT_INTRO_3, 8500ms); -                        break; - -                    case EVENT_INTRO_3: -                        Talk(SAY_JAINA_INTRO_3); -                        events.ScheduleEvent(EVENT_INTRO_4, 8s); -                        break; - -                    case EVENT_INTRO_4: -                        Talk(SAY_JAINA_INTRO_4); -                        events.ScheduleEvent(EVENT_INTRO_5, 10s); -                        break; - -                    case EVENT_INTRO_5: -                        Talk(SAY_JAINA_INTRO_5); -                        events.ScheduleEvent(EVENT_INTRO_6, 8s); -                        break; - -                    case EVENT_INTRO_6: -                        Talk(SAY_JAINA_INTRO_6); -                        events.ScheduleEvent(EVENT_INTRO_7, 12s); -                        break; - -                    case EVENT_INTRO_7: -                        Talk(SAY_JAINA_INTRO_7); -                        events.ScheduleEvent(EVENT_INTRO_8, 8s); -                        break; - -                    case EVENT_INTRO_8: -                        Talk(SAY_JAINA_INTRO_8); -                        // End of Intro -                        phase = PHASE_NORMAL; -                        break; -                } -            } +        //Return since we have no target +        if (!UpdateVictim()) +            return; -            //Return since we have no target -            if (!UpdateVictim()) -                return; +        events.Update(diff); -            events.Update(diff); - -            DoMeleeAttackIfReady(); -        } -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetForgeOfSoulsAI<npc_jaina_fosAI>(creature); +        DoMeleeAttackIfReady();      }  }; @@ -303,7 +287,7 @@ class spell_forge_of_souls_soul_sickness : public AuraScript  void AddSC_forge_of_souls()  { -    new npc_sylvanas_fos(); -    new npc_jaina_fos(); +    RegisterForgeOfSoulsCreatureAI(npc_sylvanas_fos); +    RegisterForgeOfSoulsCreatureAI(npc_jaina_fos);      RegisterSpellScript(spell_forge_of_souls_soul_sickness);  }  | 
