diff options
author | ccrs <ccrs@users.noreply.github.com> | 2018-09-20 17:13:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-09 23:42:29 +0100 |
commit | d6f9b3b55527780f05d37cc0aaa82a2304a90069 (patch) | |
tree | 5cadf3b578daabed4fb50646fefc82de13552f08 /src | |
parent | 0dccffc6a04f9272e843b7e7373c3ff185d4b41b (diff) |
Scripts/ICC: update Unchained Magic target selection
because we all love retri paladins and hate healers, right?, right?
(cherry picked from commit 2e4358f726354d3954047eb63d4390ce39247335)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp | 74 |
1 files changed, 45 insertions, 29 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 98cd02a1d5f..e6a0ba715bd 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -16,6 +16,8 @@ */ #include "icecrown_citadel.h" +#include "Containers.h" +#include "DB2Stores.h" #include "GridNotifiers.h" #include "InstanceScript.h" #include "Map.h" @@ -23,6 +25,7 @@ #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "ScriptedCreature.h" +#include "ScriptMgr.h" #include "Spell.h" #include "SpellAuraEffects.h" #include "SpellAuras.h" @@ -1152,46 +1155,59 @@ class spell_sindragosa_s_fury : public SpellScriptLoader } }; -class UnchainedMagicTargetSelector +class spell_sindragosa_unchained_magic : public SpellScript { - public: - UnchainedMagicTargetSelector() { } + PrepareSpellScript(spell_sindragosa_unchained_magic); - bool operator()(WorldObject* object) const + void FilterTargets(std::list<WorldObject*>& targets) + { + std::vector<WorldObject*> healers; + std::vector<WorldObject*> casters; + for (WorldObject* target : targets) { - if (Unit* unit = object->ToUnit()) - return unit->GetPowerType() != POWER_MANA; - return true; + Player* player = target->ToPlayer(); + if (!player) + continue; + + ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(player->GetPrimarySpecialization()); + if (specialization->Role == 1) + { + healers.push_back(target); + continue; + } + + if (specialization->Flags & CHR_SPECIALIZATION_FLAG_CASTER) + casters.push_back(target); } -}; -class spell_sindragosa_unchained_magic : public SpellScriptLoader -{ - public: - spell_sindragosa_unchained_magic() : SpellScriptLoader("spell_sindragosa_unchained_magic") { } + targets.clear(); - class spell_sindragosa_unchained_magic_SpellScript : public SpellScript + bool const is25ManRaid = GetCaster()->GetMap()->Is25ManRaid(); + if (!healers.empty()) { - PrepareSpellScript(spell_sindragosa_unchained_magic_SpellScript); - - void FilterTargets(std::list<WorldObject*>& unitList) + Trinity::Containers::RandomResize(healers, size_t(is25ManRaid ? 3 : 1)); + while (!healers.empty()) { - unitList.remove_if(UnchainedMagicTargetSelector()); - uint32 maxSize = uint32(GetCaster()->GetMap()->Is25ManRaid() ? 6 : 2); - if (unitList.size() > maxSize) - Trinity::Containers::RandomResize(unitList, maxSize); + targets.push_back(healers.back()); + healers.pop_back(); } - - void Register() override + } + if (!casters.empty()) + { + Trinity::Containers::RandomShuffle(casters); + size_t const maxSize = is25ManRaid ? 6 : 2; + while (!casters.empty() && targets.size() < maxSize) { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_unchained_magic_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + targets.push_back(casters.back()); + casters.pop_back(); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_sindragosa_unchained_magic_SpellScript(); } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_sindragosa_unchained_magic::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } }; class spell_sindragosa_frost_breath : public SpellScriptLoader @@ -1690,7 +1706,7 @@ void AddSC_boss_sindragosa() new npc_rimefang(); new npc_sindragosa_trash(); new spell_sindragosa_s_fury(); - new spell_sindragosa_unchained_magic(); + RegisterSpellScript(spell_sindragosa_unchained_magic); new spell_sindragosa_frost_breath(); new spell_sindragosa_instability(); new spell_sindragosa_frost_beacon(); |