aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp92
1 files changed, 61 insertions, 31 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
index d817c4d5707..4b62cb7de1c 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp
@@ -15,15 +15,17 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "ScriptMgr.h"
-#include "GridNotifiers.h"
#include "icecrown_citadel.h"
+#include "CommonHelpers.h"
+#include "Containers.h"
+#include "GridNotifiers.h"
#include "InstanceScript.h"
#include "Map.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
#include "SpellAuraEffects.h"
#include "SpellMgr.h"
#include "SpellScript.h"
@@ -1152,46 +1154,74 @@ 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::list<WorldObject*> healers;
+ std::list<WorldObject*> casters;
+ for (WorldObject* target : targets)
{
- if (Unit* unit = object->ToUnit())
- return unit->GetPowerType() != POWER_MANA;
- return true;
+ Player* player = target->ToPlayer();
+ if (!player || player->GetPowerType() != POWER_MANA)
+ continue;
+
+ if (Trinity::Helpers::Entity::IsPlayerHealer(player))
+ {
+ healers.push_back(target);
+ continue;
+ }
+
+ switch (player->getClass())
+ {
+ case CLASS_PRIEST:
+ case CLASS_MAGE:
+ case CLASS_WARLOCK:
+ casters.push_back(target);
+ break;
+ case CLASS_SHAMAN:
+ if (Trinity::Helpers::Entity::GetPlayerSpecialization(player) != SPEC_SHAMAN_ENHANCEMENT)
+ casters.push_back(target);
+ break;
+ case CLASS_DRUID:
+ if (Trinity::Helpers::Entity::GetPlayerSpecialization(player) != SPEC_DRUID_FERAL)
+ casters.push_back(target);
+ break;
+ default:
+ break;
+ }
}
-};
-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()->GetSpawnMode() & 1 ? 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
@@ -1685,7 +1715,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();