From 1b1e29bef40c4b02977da88f1698c79679364821 Mon Sep 17 00:00:00 2001 From: Nefertumm Date: Tue, 12 Apr 2022 20:38:08 -0300 Subject: [PATCH] fix(Core/BWL): Nefarian class call spells (#11384) --- .../BlackwingLair/boss_nefarian.cpp | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp index ab2d4dd6d..1cb6ce012 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp @@ -199,6 +199,30 @@ std::unordered_map spawnerSpells = { NPC_RED_SPAWNER, SPELL_SPAWN_RED_DRAKONID } }; +struct ClassCallSelector : public Acore::unary_function +{ + ClassCallSelector(Unit const* unit, uint8 targetClass) : _me(unit), _targetClass(targetClass) { } + + bool operator()(Unit const* target) const + { + if (!_me || !target || target->GetTypeId() != TYPEID_PLAYER) + { + return false; + } + + if (target->getClass() != _targetClass) + { + return false; + } + + return true; + } + +private: + Unit const* _me; + uint8 _targetClass; +}; + class boss_victor_nefarius : public CreatureScript { public: @@ -636,7 +660,17 @@ struct boss_nefarian : public BossAI events.ScheduleEvent(EVENT_TAILLASH, 10000); break; case EVENT_CLASSCALL: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + std::set classesPresent; + for (auto& ref : me->getThreatMgr().getThreatList()) + { + if (ref->getTarget() && ref->getTarget()->GetTypeId() == TYPEID_PLAYER) + { + classesPresent.insert(ref->getTarget()->getClass()); + } + } + uint8 targetClass = Acore::Containers::SelectRandomContainerElement(classesPresent); + + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, ClassCallSelector(me, targetClass))) { switch (target->getClass()) { @@ -997,7 +1031,7 @@ class spell_class_call_handler : public SpellScript void Register() override { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_class_call_handler::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_class_call_handler::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); if (m_scriptSpellId == SPELL_ROGUE) {