diff options
-rw-r--r-- | src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp | 660 | ||||
-rw-r--r-- | src/server/scripts/Outland/BlackTemple/illidari_council.cpp | 714 |
2 files changed, 660 insertions, 714 deletions
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp new file mode 100644 index 0000000000..73aed25b63 --- /dev/null +++ b/src/server/scripts/Outland/BlackTemple/boss_illidari_council.cpp @@ -0,0 +1,660 @@ +/* + * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by the + * Free Software Foundation; either version 3 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "CreatureScript.h" +#include "ScriptedCreature.h" +#include "SpellScriptLoader.h" +#include "black_temple.h" +#include "Player.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" + +enum Says +{ + SAY_COUNCIL_AGGRO = 0, + SAY_COUNCIL_ENRAGE = 1, + SAY_COUNCIL_SPECIAL = 2, + SAY_COUNCIL_SLAY = 3, + SAY_COUNCIL_DEATH = 4 +}; + +enum Spells +{ + SPELL_EMPYREAL_BALANCE = 41499, + SPELL_BERSERK = 41924, + + // Gathios the Shatterer + SPELL_BLESSING_OF_PROTECTION = 41450, + SPELL_BLESSING_OF_SPELL_WARDING = 41451, + SPELL_CONSECRATION = 41541, + SPELL_HAMMER_OF_JUSTICE = 41468, + SPELL_SEAL_OF_COMMAND = 41469, + SPELL_SEAL_OF_BLOOD = 41459, + SPELL_CHROMATIC_RESISTANCE_AURA = 41453, + SPELL_DEVOTION_AURA = 41452, + SPELL_JUDGEMENT = 41467, + + // High Nethermancer Zerevor + SPELL_FLAMESTRIKE = 41481, + SPELL_BLIZZARD = 41482, + SPELL_ARCANE_BOLT = 41483, + SPELL_ARCANE_EXPLOSION = 41524, + SPELL_DAMPEN_MAGIC = 41478, + + // Lady Malande + SPELL_EMPOWERED_SMITE = 41471, + SPELL_CIRCLE_OF_HEALING = 41455, + SPELL_REFLECTIVE_SHIELD = 41475, + SPELL_REFLECTIVE_SHIELD_T = 33619, + SPELL_DIVINE_WRATH = 41472, + SPELL_HEAL_VISUAL = 24171, + + // Veras Darkshadow + SPELL_DEADLY_STRIKE = 41480, + SPELL_DEADLY_POISON = 41485, + SPELL_ENVENOM = 41487, + SPELL_VANISH = 41476, + SPELL_VANISH_OUT = 41479, + SPELL_VANISH_VISUAL = 24222 +}; + +enum Misc +{ + ACTION_START_ENCOUNTER = 1, + ACTION_END_ENCOUNTER = 2, + ACTION_ENRAGE = 3, + + EVENT_SPELL_BLESSING = 1, + EVENT_SPELL_AURA = 2, + EVENT_SPELL_SEAL = 3, + EVENT_SPELL_HAMMER_OF_JUSTICE = 4, + EVENT_SPELL_JUDGEMENT = 5, + EVENT_SPELL_CONSECRATION = 6, + + EVENT_SPELL_FLAMESTRIKE = 10, + EVENT_SPELL_BLIZZARD = 11, + EVENT_SPELL_ARCANE_BOLT = 12, + EVENT_SPELL_DAMPEN_MAGIC = 13, + EVENT_SPELL_ARCANE_EXPLOSION = 14, + + EVENT_SPELL_REFLECTIVE_SHIELD = 20, + EVENT_SPELL_CIRCLE_OF_HEALING = 21, + EVENT_SPELL_DIVINE_WRATH = 22, + EVENT_SPELL_EMPOWERED_SMITE = 23, + + EVENT_SPELL_VANISH = 30, + EVENT_SPELL_VANISH_OUT = 31, + EVENT_SPELL_ENRAGE = 32, + + EVENT_KILL_TALK = 100 +}; + +class VerasEnvenom : public BasicEvent +{ +public: + VerasEnvenom(Unit& owner, ObjectGuid targetGUID) : _owner(owner), _targetGUID(targetGUID) { } + + bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override + { + if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID)) + { + target->m_clientGUIDs.insert(_owner.GetGUID()); + _owner.CastSpell(target, SPELL_ENVENOM, true); + target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON); + target->m_clientGUIDs.erase(_owner.GetGUID()); + } + return true; + } + +private: + Unit& _owner; + ObjectGuid _targetGUID; +}; + +struct boss_illidari_council : public BossAI +{ + boss_illidari_council(Creature* creature) : BossAI(creature, DATA_ILLIDARI_COUNCIL) { } + + void EnterEvadeMode(EvadeReason why) override + { + for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) + if (Creature* member = instance->GetCreature(i)) + member->AI()->EnterEvadeMode(); + + BossAI::EnterEvadeMode(why); + } + + void AttackStart(Unit*) override { } + void MoveInLineOfSight(Unit*) override { } + + void DoAction(int32 param) override + { + if (!me->isActiveObject() && param == ACTION_START_ENCOUNTER) + { + me->setActive(true); + + bool spoken = false; + for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) + { + if (Creature* member = instance->GetCreature(i)) + { + if (!spoken && (roll_chance_i(33) || i == 3)) + { + spoken = true; + member->AI()->Talk(SAY_COUNCIL_AGGRO); + } + member->SetOwnerGUID(me->GetGUID()); + member->SetInCombatWithZone(); + } + } + } + else if (param == ACTION_ENRAGE) + { + for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) + if (Creature* member = instance->GetCreature(i)) + member->AI()->DoAction(ACTION_ENRAGE); + } + else if (param == ACTION_END_ENCOUNTER) + { + me->setActive(false); + for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) + if (Creature* member = instance->GetCreature(i)) + if (member->IsAlive()) + Unit::Kill(me, member); + me->KillSelf(); + } + } + + void UpdateAI(uint32 /*diff*/) override + { + if (!me->isActiveObject()) + return; + + if (!SelectTargetFromPlayerList(115.0f)) + { + EnterEvadeMode(EVADE_REASON_NO_HOSTILES); + return; + } + + me->CastSpell(me, SPELL_EMPYREAL_BALANCE, true); + } +}; + +struct boss_illidari_council_memberAI : public ScriptedAI +{ + boss_illidari_council_memberAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + SetBoundary(instance->GetBossBoundary(DATA_ILLIDARI_COUNCIL)); + } + + InstanceScript* instance; + EventMap events; + + void Reset() override + { + events.Reset(); + } + + void EnterEvadeMode(EvadeReason why) override + { + me->SetOwnerGUID(ObjectGuid::Empty); + ScriptedAI::EnterEvadeMode(why); + } + + void DoAction(int32 param) override + { + if (param == ACTION_ENRAGE) + { + me->CastSpell(me, SPELL_BERSERK, true); + Talk(SAY_COUNCIL_ENRAGE); + } + } + + void KilledUnit(Unit*) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + { + Talk(SAY_COUNCIL_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6000); + } + } + + void JustDied(Unit*) override + { + Talk(SAY_COUNCIL_DEATH); + if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) + council->GetAI()->DoAction(ACTION_END_ENCOUNTER); + } + + void JustEngagedWith(Unit* /*who*/) override + { + if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) + council->GetAI()->DoAction(ACTION_START_ENCOUNTER); + } +}; + +struct boss_gathios_the_shatterer : public boss_illidari_council_memberAI +{ + boss_gathios_the_shatterer(Creature* creature) : boss_illidari_council_memberAI(creature) + { + _toggleBlessing = RAND(true, false); + _toggleAura = RAND(true, false); + _toggleSeal = RAND(true, false); + } + + Creature* SelectCouncilMember() + { + if (roll_chance_i(50)) + return instance->GetCreature(DATA_LADY_MALANDE); + + if (roll_chance_i(20)) + if (Creature* veras = instance->GetCreature(DATA_VERAS_DARKSHADOW)) + if (!veras->HasAura(SPELL_VANISH)) + return veras; + + return instance->GetCreature(RAND(DATA_GATHIOS_THE_SHATTERER, DATA_HIGH_NETHERMANCER_ZEREVOR)); + } + + void JustEngagedWith(Unit* who) override + { + boss_illidari_council_memberAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000); + events.ScheduleEvent(EVENT_SPELL_AURA, 0); + events.ScheduleEvent(EVENT_SPELL_SEAL, 2000); + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000); + events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000); + events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_BLESSING: + if (Unit* member = SelectCouncilMember()) + { + me->CastSpell(member, _toggleBlessing ? SPELL_BLESSING_OF_PROTECTION : SPELL_BLESSING_OF_SPELL_WARDING); + _toggleBlessing = !_toggleBlessing; + } + events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000); + break; + case EVENT_SPELL_AURA: + me->CastSpell(me, _toggleAura ? SPELL_DEVOTION_AURA : SPELL_CHROMATIC_RESISTANCE_AURA); + _toggleAura = !_toggleAura; + events.ScheduleEvent(EVENT_SPELL_AURA, 60000); + break; + case EVENT_SPELL_CONSECRATION: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_CONSECRATION, false); + events.ScheduleEvent(EVENT_SPELL_AURA, 30000); + break; + case EVENT_SPELL_HAMMER_OF_JUSTICE: + if (Unit* target = me->GetVictim()) + if (target->IsPlayer() && me->IsInRange(target, 10.0f, 40.0f, true)) + { + me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE); + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20s); + break; + } + events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0); + break; + case EVENT_SPELL_SEAL: + me->CastSpell(me, _toggleSeal ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD); + _toggleSeal = !_toggleSeal; + events.ScheduleEvent(EVENT_SPELL_SEAL, 20000); + break; + case EVENT_SPELL_JUDGEMENT: + me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false); + events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000); + break; + } + + DoMeleeAttackIfReady(); + } +private: + bool _toggleBlessing; + bool _toggleAura; + bool _toggleSeal; +}; + +struct boss_high_nethermancer_zerevor : public boss_illidari_council_memberAI +{ + boss_high_nethermancer_zerevor(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void AttackStart(Unit* who) override + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); + } + + void JustEngagedWith(Unit* who) override + { + boss_illidari_council_memberAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); + events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); + events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); + events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_DAMPEN_MAGIC: + me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); + events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); + break; + case EVENT_SPELL_ARCANE_BOLT: + me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); + break; + case EVENT_SPELL_FLAMESTRIKE: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) + me->CastSpell(target, SPELL_FLAMESTRIKE, false); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); + break; + case EVENT_SPELL_BLIZZARD: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) + me->CastSpell(target, SPELL_BLIZZARD, false); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); + break; + case EVENT_SPELL_ARCANE_EXPLOSION: + if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) + me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); + break; + } + + DoMeleeAttackIfReady(); + } +}; + +struct boss_lady_malande : public boss_illidari_council_memberAI +{ + boss_lady_malande(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void AttackStart(Unit* who) override + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); + } + + void JustEngagedWith(Unit* who) override + { + boss_illidari_council_memberAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000); + events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); + events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000); + events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_CIRCLE_OF_HEALING: + me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false); + events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); + break; + case EVENT_SPELL_REFLECTIVE_SHIELD: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false); + events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000); + break; + case EVENT_SPELL_DIVINE_WRATH: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) + me->CastSpell(target, SPELL_DIVINE_WRATH, false); + events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000); + break; + case EVENT_SPELL_EMPOWERED_SMITE: + me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false); + events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000); + break; + } + } +}; + +struct boss_veras_darkshadow : public boss_illidari_council_memberAI +{ + boss_veras_darkshadow(Creature* creature) : boss_illidari_council_memberAI(creature) { } + + void JustEngagedWith(Unit* who) override + { + me->SetCanDualWield(true); + boss_illidari_council_memberAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SPELL_VANISH, 10000); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000); + } + + void JustSummoned(Creature* summon) override + { + summon->CastSpell(summon, SPELL_VANISH_VISUAL, true); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_SPELL_VANISH: + if (roll_chance_i(50)) + Talk(SAY_COUNCIL_SPECIAL); + me->CastSpell(me, SPELL_DEADLY_STRIKE, false); + me->CastSpell(me, SPELL_VANISH, false); + events.ScheduleEvent(EVENT_SPELL_VANISH, 60000); + events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000); + break; + case EVENT_SPELL_VANISH_OUT: + me->CastSpell(me, SPELL_VANISH_OUT, false); + break; + case EVENT_SPELL_ENRAGE: + DoResetThreatList(); + if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) + council->GetAI()->DoAction(ACTION_ENRAGE); + break; + } + + if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0) + DoMeleeAttackIfReady(); + } +}; + +class spell_illidari_council_balance_of_power_aura : public AuraScript +{ + PrepareAuraScript(spell_illidari_council_balance_of_power_aura); + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + // Set absorbtion amount to unlimited (no absorb) + amount = -1; + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_aura::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } +}; + +class spell_illidari_council_empyreal_balance : public SpellScript +{ + PrepareSpellScript(spell_illidari_council_empyreal_balance); + + bool Load() override + { + _sharedHealth = 0; + _sharedHealthMax = 0; + _targetCount = 0; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + { + _targetCount++; + _sharedHealth += target->GetHealth(); + _sharedHealthMax += target->GetMaxHealth(); + } + } + + void HandleAfterCast() + { + if (_targetCount != 4) + { + GetCaster()->ToCreature()->AI()->EnterEvadeMode(); + return; + } + + float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; + std::list<TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list<TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) + { + target->LowerPlayerDamageReq(target->GetMaxHealth()); + target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance::HandleAfterCast); + } + +private: + float _sharedHealth; + float _sharedHealthMax; + uint8 _targetCount; +}; + +class spell_illidari_council_reflective_shield_aura : public AuraScript +{ + PrepareAuraScript(spell_illidari_council_reflective_shield_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_REFLECTIVE_SHIELD_T }); + } + + void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + { + Unit* target = GetTarget(); + if (dmgInfo.GetAttacker() == target) + return; + + int32 bp = absorbAmount / 2; + target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, nullptr, aurEff); + } + + void Register() override + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_aura::ReflectDamage, EFFECT_0); + } +}; + +class spell_illidari_council_judgement : public SpellScript +{ + PrepareSpellScript(spell_illidari_council_judgement); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + auto const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (auto i = auras.begin(); i != auras.end(); ++i) + { + if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) + if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) + { + GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); + GetCaster()->RemoveAurasDueToSpell((*i)->GetSpellInfo()->Id); + break; + } + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_illidari_council_deadly_strike_aura : public AuraScript +{ + PrepareAuraScript(spell_illidari_council_deadly_strike_aura); + + void Update(AuraEffect const* effect) + { + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + { + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +void AddSC_boss_illidari_council() +{ + RegisterBlackTempleCreatureAI(boss_illidari_council); + RegisterBlackTempleCreatureAI(boss_gathios_the_shatterer); + RegisterBlackTempleCreatureAI(boss_lady_malande); + RegisterBlackTempleCreatureAI(boss_veras_darkshadow); + RegisterBlackTempleCreatureAI(boss_high_nethermancer_zerevor); + RegisterSpellScript(spell_illidari_council_balance_of_power_aura); + RegisterSpellScript(spell_illidari_council_empyreal_balance); + RegisterSpellScript(spell_illidari_council_reflective_shield_aura); + RegisterSpellScript(spell_illidari_council_judgement); + RegisterSpellScript(spell_illidari_council_deadly_strike_aura); +} diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp deleted file mode 100644 index 39417fd2cb..0000000000 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ /dev/null @@ -1,714 +0,0 @@ -/* - * This file is part of the AzerothCore Project. See AUTHORS file for Copyright information - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by the - * Free Software Foundation; either version 3 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "CreatureScript.h" -#include "ScriptedCreature.h" -#include "SpellScriptLoader.h" -#include "black_temple.h" -#include "Player.h" -#include "SpellAuraEffects.h" -#include "SpellScript.h" - -enum Says -{ - SAY_COUNCIL_AGGRO = 0, - SAY_COUNCIL_ENRAGE = 1, - SAY_COUNCIL_SPECIAL = 2, - SAY_COUNCIL_SLAY = 3, - SAY_COUNCIL_DEATH = 4 -}; - -enum Spells -{ - SPELL_EMPYREAL_BALANCE = 41499, - SPELL_BERSERK = 41924, - - // Gathios the Shatterer - SPELL_BLESSING_OF_PROTECTION = 41450, - SPELL_BLESSING_OF_SPELL_WARDING = 41451, - SPELL_CONSECRATION = 41541, - SPELL_HAMMER_OF_JUSTICE = 41468, - SPELL_SEAL_OF_COMMAND = 41469, - SPELL_SEAL_OF_BLOOD = 41459, - SPELL_CHROMATIC_RESISTANCE_AURA = 41453, - SPELL_DEVOTION_AURA = 41452, - SPELL_JUDGEMENT = 41467, - - // High Nethermancer Zerevor - SPELL_FLAMESTRIKE = 41481, - SPELL_BLIZZARD = 41482, - SPELL_ARCANE_BOLT = 41483, - SPELL_ARCANE_EXPLOSION = 41524, - SPELL_DAMPEN_MAGIC = 41478, - - // Lady Malande - SPELL_EMPOWERED_SMITE = 41471, - SPELL_CIRCLE_OF_HEALING = 41455, - SPELL_REFLECTIVE_SHIELD = 41475, - SPELL_REFLECTIVE_SHIELD_T = 33619, - SPELL_DIVINE_WRATH = 41472, - SPELL_HEAL_VISUAL = 24171, - - // Veras Darkshadow - SPELL_DEADLY_STRIKE = 41480, - SPELL_DEADLY_POISON = 41485, - SPELL_ENVENOM = 41487, - SPELL_VANISH = 41476, - SPELL_VANISH_OUT = 41479, - SPELL_VANISH_VISUAL = 24222 -}; - -enum Misc -{ - ACTION_START_ENCOUNTER = 1, - ACTION_END_ENCOUNTER = 2, - ACTION_ENRAGE = 3, - - EVENT_SPELL_BLESSING = 1, - EVENT_SPELL_AURA = 2, - EVENT_SPELL_SEAL = 3, - EVENT_SPELL_HAMMER_OF_JUSTICE = 4, - EVENT_SPELL_JUDGEMENT = 5, - EVENT_SPELL_CONSECRATION = 6, - - EVENT_SPELL_FLAMESTRIKE = 10, - EVENT_SPELL_BLIZZARD = 11, - EVENT_SPELL_ARCANE_BOLT = 12, - EVENT_SPELL_DAMPEN_MAGIC = 13, - EVENT_SPELL_ARCANE_EXPLOSION = 14, - - EVENT_SPELL_REFLECTIVE_SHIELD = 20, - EVENT_SPELL_CIRCLE_OF_HEALING = 21, - EVENT_SPELL_DIVINE_WRATH = 22, - EVENT_SPELL_EMPOWERED_SMITE = 23, - - EVENT_SPELL_VANISH = 30, - EVENT_SPELL_VANISH_OUT = 31, - EVENT_SPELL_ENRAGE = 32, - - EVENT_KILL_TALK = 100 -}; - -class VerasEnvenom : public BasicEvent -{ -public: - VerasEnvenom(Unit& owner, ObjectGuid targetGUID) : _owner(owner), _targetGUID(targetGUID) { } - - bool Execute(uint64 /*eventTime*/, uint32 /*updateTime*/) override - { - if (Player* target = ObjectAccessor::GetPlayer(_owner, _targetGUID)) - { - target->m_clientGUIDs.insert(_owner.GetGUID()); - _owner.CastSpell(target, SPELL_ENVENOM, true); - target->RemoveAurasDueToSpell(SPELL_DEADLY_POISON); - target->m_clientGUIDs.erase(_owner.GetGUID()); - } - return true; - } - -private: - Unit& _owner; - ObjectGuid _targetGUID; -}; - -class boss_illidari_council : public CreatureScript -{ -public: - boss_illidari_council() : CreatureScript("boss_illidari_council") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_illidari_councilAI>(creature); - } - - struct boss_illidari_councilAI : public BossAI - { - boss_illidari_councilAI(Creature* creature) : BossAI(creature, DATA_ILLIDARI_COUNCIL) { } - - void EnterEvadeMode(EvadeReason why) override - { - for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) - if (Creature* member = instance->GetCreature(i)) - member->AI()->EnterEvadeMode(); - - BossAI::EnterEvadeMode(why); - } - - void AttackStart(Unit*) override { } - void MoveInLineOfSight(Unit*) override { } - - void DoAction(int32 param) override - { - if (!me->isActiveObject() && param == ACTION_START_ENCOUNTER) - { - me->setActive(true); - - bool spoken = false; - for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) - { - if (Creature* member = instance->GetCreature(i)) - { - if (!spoken && (roll_chance_i(33) || i == 3)) - { - spoken = true; - member->AI()->Talk(SAY_COUNCIL_AGGRO); - } - member->SetOwnerGUID(me->GetGUID()); - member->SetInCombatWithZone(); - } - } - } - else if (param == ACTION_ENRAGE) - { - for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) - if (Creature* member = instance->GetCreature(i)) - member->AI()->DoAction(ACTION_ENRAGE); - } - else if (param == ACTION_END_ENCOUNTER) - { - me->setActive(false); - for (uint8 i = DATA_GATHIOS_THE_SHATTERER; i <= DATA_VERAS_DARKSHADOW; ++i) - if (Creature* member = instance->GetCreature(i)) - if (member->IsAlive()) - Unit::Kill(me, member); - me->KillSelf(); - } - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!me->isActiveObject()) - return; - - if (!SelectTargetFromPlayerList(115.0f)) - { - EnterEvadeMode(EVADE_REASON_NO_HOSTILES); - return; - } - - me->CastSpell(me, SPELL_EMPYREAL_BALANCE, true); - } - }; -}; -struct boss_illidari_council_memberAI : public ScriptedAI -{ - boss_illidari_council_memberAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - SetBoundary(instance->GetBossBoundary(DATA_ILLIDARI_COUNCIL)); - } - - InstanceScript* instance; - EventMap events; - - void Reset() override - { - events.Reset(); - } - - void EnterEvadeMode(EvadeReason why) override - { - me->SetOwnerGUID(ObjectGuid::Empty); - ScriptedAI::EnterEvadeMode(why); - } - - void DoAction(int32 param) override - { - if (param == ACTION_ENRAGE) - { - me->CastSpell(me, SPELL_BERSERK, true); - Talk(SAY_COUNCIL_ENRAGE); - } - } - - void KilledUnit(Unit*) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_COUNCIL_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6000); - } - } - - void JustDied(Unit*) override - { - Talk(SAY_COUNCIL_DEATH); - if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) - council->GetAI()->DoAction(ACTION_END_ENCOUNTER); - } - - void JustEngagedWith(Unit* /*who*/) override - { - if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) - council->GetAI()->DoAction(ACTION_START_ENCOUNTER); - } -}; - -class boss_gathios_the_shatterer : public CreatureScript -{ -public: - boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_gathios_the_shattererAI>(creature); - } - - struct boss_gathios_the_shattererAI : public boss_illidari_council_memberAI - { - boss_gathios_the_shattererAI(Creature* creature) : boss_illidari_council_memberAI(creature) - { - _toggleBlessing = RAND(true, false); - _toggleAura = RAND(true, false); - _toggleSeal = RAND(true, false); - } - - Creature* SelectCouncilMember() - { - if (roll_chance_i(50)) - return instance->GetCreature(DATA_LADY_MALANDE); - - if (roll_chance_i(20)) - if (Creature* veras = instance->GetCreature(DATA_VERAS_DARKSHADOW)) - if (!veras->HasAura(SPELL_VANISH)) - return veras; - - return instance->GetCreature(RAND(DATA_GATHIOS_THE_SHATTERER, DATA_HIGH_NETHERMANCER_ZEREVOR)); - } - - void JustEngagedWith(Unit* who) override - { - boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_BLESSING, 10000); - events.ScheduleEvent(EVENT_SPELL_AURA, 0); - events.ScheduleEvent(EVENT_SPELL_SEAL, 2000); - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 6000); - events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 8000); - events.ScheduleEvent(EVENT_SPELL_CONSECRATION, 4000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_BLESSING: - if (Unit* member = SelectCouncilMember()) - { - me->CastSpell(member, _toggleBlessing ? SPELL_BLESSING_OF_PROTECTION : SPELL_BLESSING_OF_SPELL_WARDING); - _toggleBlessing = !_toggleBlessing; - } - events.ScheduleEvent(EVENT_SPELL_BLESSING, 15000); - break; - case EVENT_SPELL_AURA: - me->CastSpell(me, _toggleAura ? SPELL_DEVOTION_AURA : SPELL_CHROMATIC_RESISTANCE_AURA); - _toggleAura = !_toggleAura; - events.ScheduleEvent(EVENT_SPELL_AURA, 60000); - break; - case EVENT_SPELL_CONSECRATION: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_CONSECRATION, false); - events.ScheduleEvent(EVENT_SPELL_AURA, 30000); - break; - case EVENT_SPELL_HAMMER_OF_JUSTICE: - if (Unit* target = me->GetVictim()) - if (target->IsPlayer() && me->IsInRange(target, 10.0f, 40.0f, true)) - { - me->CastSpell(target, SPELL_HAMMER_OF_JUSTICE); - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 20s); - break; - } - events.ScheduleEvent(EVENT_SPELL_HAMMER_OF_JUSTICE, 0); - break; - case EVENT_SPELL_SEAL: - me->CastSpell(me, _toggleSeal ? SPELL_SEAL_OF_COMMAND : SPELL_SEAL_OF_BLOOD); - _toggleSeal = !_toggleSeal; - events.ScheduleEvent(EVENT_SPELL_SEAL, 20000); - break; - case EVENT_SPELL_JUDGEMENT: - me->CastSpell(me->GetVictim(), SPELL_JUDGEMENT, false); - events.ScheduleEvent(EVENT_SPELL_JUDGEMENT, 20000); - break; - } - - DoMeleeAttackIfReady(); - } - private: - bool _toggleBlessing; - bool _toggleAura; - bool _toggleSeal; - }; -}; - -class boss_high_nethermancer_zerevor : public CreatureScript -{ -public: - boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_high_nethermancer_zerevorAI>(creature); - } - - struct boss_high_nethermancer_zerevorAI : public boss_illidari_council_memberAI - { - boss_high_nethermancer_zerevorAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } - - void AttackStart(Unit* who) override - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); - } - - void JustEngagedWith(Unit* who) override - { - boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 5000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 15000); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 0); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_DAMPEN_MAGIC: - me->CastSpell(me, SPELL_DAMPEN_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DAMPEN_MAGIC, 120000); - break; - case EVENT_SPELL_ARCANE_BOLT: - me->CastSpell(me->GetVictim(), SPELL_ARCANE_BOLT, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_BOLT, 3000); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_FLAMESTRIKE, false); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 40000); - break; - case EVENT_SPELL_BLIZZARD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_BLIZZARD, false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 40000); - break; - case EVENT_SPELL_ARCANE_EXPLOSION: - if (SelectTarget(SelectTargetMethod::Random, 0, 10.0f)) - me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_EXPLOSION, 10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; -}; - -class boss_lady_malande : public CreatureScript -{ -public: - boss_lady_malande() : CreatureScript("boss_lady_malande") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_lady_malandeAI>(creature); - } - - struct boss_lady_malandeAI : public boss_illidari_council_memberAI - { - boss_lady_malandeAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } - - void AttackStart(Unit* who) override - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); - } - - void JustEngagedWith(Unit* who) override - { - boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 10000); - events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); - events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 5000); - events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 15000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_CIRCLE_OF_HEALING: - me->CastSpell(me, SPELL_CIRCLE_OF_HEALING, false); - events.ScheduleEvent(EVENT_SPELL_CIRCLE_OF_HEALING, 20000); - break; - case EVENT_SPELL_REFLECTIVE_SHIELD: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_REFLECTIVE_SHIELD, false); - events.ScheduleEvent(EVENT_SPELL_REFLECTIVE_SHIELD, 40000); - break; - case EVENT_SPELL_DIVINE_WRATH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - me->CastSpell(target, SPELL_DIVINE_WRATH, false); - events.ScheduleEvent(EVENT_SPELL_DIVINE_WRATH, 20000); - break; - case EVENT_SPELL_EMPOWERED_SMITE: - me->CastSpell(me->GetVictim(), SPELL_EMPOWERED_SMITE, false); - events.ScheduleEvent(EVENT_SPELL_EMPOWERED_SMITE, 3000); - break; - } - } - }; -}; - -class boss_veras_darkshadow : public CreatureScript -{ -public: - boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { } - - CreatureAI* GetAI(Creature* creature) const override - { - return GetBlackTempleAI<boss_veras_darkshadowAI>(creature); - } - - struct boss_veras_darkshadowAI : public boss_illidari_council_memberAI - { - boss_veras_darkshadowAI(Creature* creature) : boss_illidari_council_memberAI(creature) { } - - void JustEngagedWith(Unit* who) override - { - me->SetCanDualWield(true); - boss_illidari_council_memberAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPELL_VANISH, 10000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 900000); - } - - void JustSummoned(Creature* summon) override - { - summon->CastSpell(summon, SPELL_VANISH_VISUAL, true); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_VANISH: - if (roll_chance_i(50)) - Talk(SAY_COUNCIL_SPECIAL); - me->CastSpell(me, SPELL_DEADLY_STRIKE, false); - me->CastSpell(me, SPELL_VANISH, false); - events.ScheduleEvent(EVENT_SPELL_VANISH, 60000); - events.ScheduleEvent(EVENT_SPELL_VANISH_OUT, 29000); - break; - case EVENT_SPELL_VANISH_OUT: - me->CastSpell(me, SPELL_VANISH_OUT, false); - break; - case EVENT_SPELL_ENRAGE: - DoResetThreatList(); - if (Creature* council = instance->GetCreature(DATA_ILLIDARI_COUNCIL)) - council->GetAI()->DoAction(ACTION_ENRAGE); - break; - } - - if (events.GetNextEventTime(EVENT_SPELL_VANISH_OUT) == 0) - DoMeleeAttackIfReady(); - } - }; -}; - -class spell_illidari_council_balance_of_power_aura : public AuraScript -{ - PrepareAuraScript(spell_illidari_council_balance_of_power_aura); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited (no absorb) - amount = -1; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_aura::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } -}; - -class spell_illidari_council_empyreal_balance : public SpellScript -{ - PrepareSpellScript(spell_illidari_council_empyreal_balance); - - bool Load() override - { - _sharedHealth = 0; - _sharedHealthMax = 0; - _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - { - _targetCount++; - _sharedHealth += target->GetHealth(); - _sharedHealthMax += target->GetMaxHealth(); - } - } - - void HandleAfterCast() - { - if (_targetCount != 4) - { - GetCaster()->ToCreature()->AI()->EnterEvadeMode(); - return; - } - - float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; - std::list<TargetInfo> const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list<TargetInfo>::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) - { - target->LowerPlayerDamageReq(target->GetMaxHealth()); - target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance::HandleAfterCast); - } - -private: - float _sharedHealth; - float _sharedHealthMax; - uint8 _targetCount; -}; - -class spell_illidari_council_reflective_shield_aura : public AuraScript -{ - PrepareAuraScript(spell_illidari_council_reflective_shield_aura); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_REFLECTIVE_SHIELD_T }); - } - - void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - Unit* target = GetTarget(); - if (dmgInfo.GetAttacker() == target) - return; - - int32 bp = absorbAmount / 2; - target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, nullptr, aurEff); - } - - void Register() override - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_aura::ReflectDamage, EFFECT_0); - } -}; - -class spell_illidari_council_judgement : public SpellScript -{ - PrepareSpellScript(spell_illidari_council_judgement); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - auto const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (auto i = auras.begin(); i != auras.end(); ++i) - { - if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) - if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) - { - GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); - GetCaster()->RemoveAurasDueToSpell((*i)->GetSpellInfo()->Id); - break; - } - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } -}; - -class spell_illidari_council_deadly_strike_aura : public AuraScript -{ - PrepareAuraScript(spell_illidari_council_deadly_strike_aura); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } -}; - -void AddSC_boss_illidari_council() -{ - new boss_illidari_council(); - new boss_gathios_the_shatterer(); - new boss_lady_malande(); - new boss_veras_darkshadow(); - new boss_high_nethermancer_zerevor(); - RegisterSpellScript(spell_illidari_council_balance_of_power_aura); - RegisterSpellScript(spell_illidari_council_empyreal_balance); - RegisterSpellScript(spell_illidari_council_reflective_shield_aura); - RegisterSpellScript(spell_illidari_council_judgement); - RegisterSpellScript(spell_illidari_council_deadly_strike_aura); -} |