diff options
-rw-r--r-- | src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp | 1652 |
1 files changed, 730 insertions, 922 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp index 1017449431f..ceab2903e39 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp @@ -216,225 +216,214 @@ uint32 const PrincesData[] = DATA_PRINCE_VALANAR }; -class boss_blood_council_controller : public CreatureScript +struct boss_blood_council_controller : public BossAI { - public: - boss_blood_council_controller() : CreatureScript("boss_blood_council_controller") { } + boss_blood_council_controller(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) + { + Initialize(); + SetCombatMovement(false); + } + + void Initialize() + { + _invocationStage = 0; + _resetCounter = 0; + } + + void Reset() override + { + _Reset(); + Initialize(); + me->SummonCreatureGroup(SUMMON_PRINCES_GROUP); + + if (!instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) + for (uint32 bossData : PrincesData) + if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) + { + prince->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + prince->SetImmuneToPC(false); + if (bossData == DATA_PRINCE_VALANAR) + { + prince->SetHealth(prince->GetMaxHealth()); + prince->CastSpell(prince, SPELL_REMOVE_EMPOWERED_BLOOD, true); + } + } + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + for (uint32 bossData : PrincesData) + if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, prince); - struct boss_blood_council_controllerAI : public BossAI + summons.DespawnAll(); + _DespawnAtEvade(); + } + + void JustEngagedWith(Unit* who) override + { + if (instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == IN_PROGRESS) + return; + + if (!instance->CheckRequiredBosses(DATA_BLOOD_PRINCE_COUNCIL, who->ToPlayer())) { - boss_blood_council_controllerAI(Creature* creature) : BossAI(creature, DATA_BLOOD_PRINCE_COUNCIL) - { - Initialize(); - SetCombatMovement(false); - } + EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK); + instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); + return; + } - void Initialize() - { - _invocationStage = 0; - _resetCounter = 0; - } + me->SetCombatPulseDelay(5); + me->setActive(true); + DoZoneInCombat(); + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, IN_PROGRESS); - void Reset() override - { - _Reset(); - Initialize(); - me->SummonCreatureGroup(SUMMON_PRINCES_GROUP); - - if (!instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) - for (uint32 bossData : PrincesData) - if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) - { - prince->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - prince->SetImmuneToPC(false); - if (bossData == DATA_PRINCE_VALANAR) - { - prince->SetHealth(prince->GetMaxHealth()); - prince->CastSpell(prince, SPELL_REMOVE_EMPOWERED_BLOOD, true); - } - } - } + DoCastSelf(SPELL_INVOCATION_OF_BLOOD_VALANAR); - void EnterEvadeMode(EvadeReason /*why*/) override + for (uint32 bossData : PrincesData) + if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) { - for (uint32 bossData : PrincesData) - if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) - instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, prince); - - summons.DespawnAll(); - _DespawnAtEvade(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, prince); + DoZoneInCombat(prince); } - void JustEngagedWith(Unit* who) override - { - if (instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) == IN_PROGRESS) - return; + events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, Seconds(46) + Milliseconds(500)); - if (!instance->CheckRequiredBosses(DATA_BLOOD_PRINCE_COUNCIL, who->ToPlayer())) - { - EnterEvadeMode(EVADE_REASON_SEQUENCE_BREAK); - instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT); - return; - } + _invocationOrder[0] = InvocationData(instance->GetGuidData(DATA_PRINCE_VALANAR), SPELL_INVOCATION_OF_BLOOD_VALANAR, EMOTE_VALANAR_INVOCATION, SPELL_INVOCATION_VISUAL_VALANAR); + if (roll_chance_i(50)) + { + _invocationOrder[1] = InvocationData(instance->GetGuidData(DATA_PRINCE_TALDARAM), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, SPELL_INVOCATION_VISUAL_TALDARAM); + _invocationOrder[2] = InvocationData(instance->GetGuidData(DATA_PRINCE_KELESETH), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, SPELL_INVOCATION_VISUAL_KELESETH); + } + else + { + _invocationOrder[1] = InvocationData(instance->GetGuidData(DATA_PRINCE_KELESETH), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, SPELL_INVOCATION_VISUAL_KELESETH); + _invocationOrder[2] = InvocationData(instance->GetGuidData(DATA_PRINCE_TALDARAM), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, SPELL_INVOCATION_VISUAL_TALDARAM); + } + } - me->SetCombatPulseDelay(5); - me->setActive(true); - DoZoneInCombat(); - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, IN_PROGRESS); + void SetData(uint32 /*type*/, uint32 data) override + { + _resetCounter += uint8(data); + if (_resetCounter == 3) + EnterEvadeMode(EVADE_REASON_OTHER); + } - DoCastSelf(SPELL_INVOCATION_OF_BLOOD_VALANAR); + uint32 GetData(uint32 data) const override + { + if (data == DATA_INTRO && !instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) + return DATA_INTRO_DONE; + return 0; + } - for (uint32 bossData : PrincesData) - if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) - { - instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, prince); - DoZoneInCombat(prince); - } + void JustDied(Unit* killer) override + { + events.Reset(); + instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, DONE); + // Kill all prices + for (uint8 i = 0; i < 3; ++i) + { + if (++_invocationStage == 3) + _invocationStage = 0; - events.ScheduleEvent(EVENT_INVOCATION_OF_BLOOD, Seconds(46) + Milliseconds(500)); + if (Creature* prince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid)) + { + // Make sure looting is allowed + if (me->IsDamageEnoughForLootingAndReward()) + prince->LowerPlayerDamageReq(prince->GetMaxHealth()); + Unit::Kill(killer, prince); + } + } + } - _invocationOrder[0] = InvocationData(instance->GetGuidData(DATA_PRINCE_VALANAR), SPELL_INVOCATION_OF_BLOOD_VALANAR, EMOTE_VALANAR_INVOCATION, SPELL_INVOCATION_VISUAL_VALANAR); - if (roll_chance_i(50)) - { - _invocationOrder[1] = InvocationData(instance->GetGuidData(DATA_PRINCE_TALDARAM), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, SPELL_INVOCATION_VISUAL_TALDARAM); - _invocationOrder[2] = InvocationData(instance->GetGuidData(DATA_PRINCE_KELESETH), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, SPELL_INVOCATION_VISUAL_KELESETH); - } - else + void DoAction(int32 actionId) override + { + if (actionId == ACTION_START_INTRO && instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO) && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) + { + instance->SetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO, 0); + if (Creature* bloodQueen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL))) + bloodQueen->AI()->DoAction(ACTION_START_INTRO); + } + else if (actionId == ACTION_INTRO_DONE) + { + // Remove feigh death from princes + for (uint32 bossData : PrincesData) + if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) { - _invocationOrder[1] = InvocationData(instance->GetGuidData(DATA_PRINCE_KELESETH), SPELL_INVOCATION_OF_BLOOD_KELESETH, EMOTE_KELESETH_INVOCATION, SPELL_INVOCATION_VISUAL_KELESETH); - _invocationOrder[2] = InvocationData(instance->GetGuidData(DATA_PRINCE_TALDARAM), SPELL_INVOCATION_OF_BLOOD_TALDARAM, EMOTE_TALDARAM_INVOCATION, SPELL_INVOCATION_VISUAL_TALDARAM); + prince->AI()->DoAction(ACTION_STAND_UP); + if (bossData == DATA_PRINCE_VALANAR) + prince->SetHealth(prince->GetMaxHealth()); } - } + } + } - void SetData(uint32 /*type*/, uint32 data) override - { - _resetCounter += uint8(data); - if (_resetCounter == 3) - EnterEvadeMode(EVADE_REASON_OTHER); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - uint32 GetData(uint32 data) const override - { - if (data == DATA_INTRO && !instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO)) - return DATA_INTRO_DONE; - return 0; - } + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void JustDied(Unit* killer) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - events.Reset(); - instance->SetBossState(DATA_BLOOD_PRINCE_COUNCIL, DONE); - // Kill all prices - for (uint8 i = 0; i < 3; ++i) + case EVENT_INVOCATION_OF_BLOOD: { + Creature* oldPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid); if (++_invocationStage == 3) _invocationStage = 0; - if (Creature* prince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid)) + Creature* newPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid); + if (oldPrince) { - // Make sure looting is allowed - if (me->IsDamageEnoughForLootingAndReward()) - prince->LowerPlayerDamageReq(prince->GetMaxHealth()); - Unit::Kill(killer, prince); + oldPrince->AI()->DoAction(ACTION_REMOVE_INVOCATION); + if (newPrince) + oldPrince->CastSpell(newPrince, _invocationOrder[_invocationStage].visualSpell, true); } - } - } - - void DoAction(int32 actionId) override - { - if (actionId == ACTION_START_INTRO && instance->GetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO) && instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE) - { - instance->SetData(DATA_BLOOD_PRINCE_COUNCIL_INTRO, 0); - if (Creature* bloodQueen = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BLOOD_QUEEN_LANA_THEL_COUNCIL))) - bloodQueen->AI()->DoAction(ACTION_START_INTRO); - } - else if (actionId == ACTION_INTRO_DONE) - { - // Remove feigh death from princes - for (uint32 bossData : PrincesData) - if (Creature* prince = ObjectAccessor::GetCreature(*me, instance->GetGuidData(bossData))) - { - prince->AI()->DoAction(ACTION_STAND_UP); - if (bossData == DATA_PRINCE_VALANAR) - prince->SetHealth(prince->GetMaxHealth()); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + if (newPrince) { - case EVENT_INVOCATION_OF_BLOOD: - { - Creature* oldPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid); - if (++_invocationStage == 3) - _invocationStage = 0; - - Creature* newPrince = ObjectAccessor::GetCreature(*me, _invocationOrder[_invocationStage].guid); - if (oldPrince) - { - oldPrince->AI()->DoAction(ACTION_REMOVE_INVOCATION); - if (newPrince) - oldPrince->CastSpell(newPrince, _invocationOrder[_invocationStage].visualSpell, true); - } - - if (newPrince) - { - newPrince->SetHealth(me->GetHealth()); - newPrince->AI()->Talk(uint8(_invocationOrder[_invocationStage].textId)); - } - - DoCastSelf(_invocationOrder[_invocationStage].spellId); - events.Repeat(Seconds(46) + Milliseconds(500)); - break; - } - default: - break; + newPrince->SetHealth(me->GetHealth()); + newPrince->AI()->Talk(uint8(_invocationOrder[_invocationStage].textId)); } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + DoCastSelf(_invocationOrder[_invocationStage].spellId); + events.Repeat(Seconds(46) + Milliseconds(500)); + break; } + default: + break; } - private: - struct InvocationData - { - ObjectGuid guid; - uint32 spellId; - uint32 textId; - uint32 visualSpell; - - InvocationData(ObjectGuid _guid, uint32 _spellId, uint32 _textId, uint32 _visualSpell) - { - guid = _guid; - spellId = _spellId; - textId = _textId; - visualSpell = _visualSpell; - } - - InvocationData() : spellId(0), textId(0), visualSpell(0) { } - } _invocationOrder[3]; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } - uint32 _invocationStage; - uint32 _resetCounter; - }; +private: + struct InvocationData + { + ObjectGuid guid; + uint32 spellId; + uint32 textId; + uint32 visualSpell; - CreatureAI* GetAI(Creature* creature) const override + InvocationData(ObjectGuid _guid, uint32 _spellId, uint32 _textId, uint32 _visualSpell) { - return GetIcecrownCitadelAI<boss_blood_council_controllerAI>(creature); + guid = _guid; + spellId = _spellId; + textId = _textId; + visualSpell = _visualSpell; } + + InvocationData() : spellId(0), textId(0), visualSpell(0) { } + } _invocationOrder[3]; + + uint32 _invocationStage; + uint32 _resetCounter; }; struct BloodPrincesBossAI : public BossAI @@ -624,903 +613,717 @@ protected: bool _isEmpowered; }; -class boss_prince_keleseth_icc : public CreatureScript +struct boss_prince_keleseth_icc : public BloodPrincesBossAI { - public: - boss_prince_keleseth_icc() : CreatureScript("boss_prince_keleseth_icc") { } + boss_prince_keleseth_icc(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_KELESETH) { } - struct boss_prince_kelesethAI : public BloodPrincesBossAI - { - boss_prince_kelesethAI(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_KELESETH) { } - - void ScheduleEvents() override - { - events.ScheduleEvent(EVENT_BERSERK, 10min); - events.ScheduleEvent(EVENT_SHADOW_RESONANCE, 10s, 15s); - events.ScheduleEvent(EVENT_SHADOW_LANCE, 2s); - - if (IsHeroic()) - { - DoCastSelf(SPELL_SHADOW_PRISON, true); - DoCastSelf(SPELL_SHADOW_PRISON_DUMMY); - } - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - Position pos = me->GetPosition(); - float maxRange = me->GetDistance2d(summon); - float angle = me->GetAbsoluteAngle(summon); - me->MovePositionToFirstCollision(pos, maxRange, angle); - summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); - summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN); - } + void ScheduleEvents() override + { + events.ScheduleEvent(EVENT_BERSERK, 10min); + events.ScheduleEvent(EVENT_SHADOW_RESONANCE, 10s, 15s); + events.ScheduleEvent(EVENT_SHADOW_LANCE, 2s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + if (IsHeroic()) + { + DoCastSelf(SPELL_SHADOW_PRISON, true); + DoCastSelf(SPELL_SHADOW_PRISON_DUMMY); + } + } - events.Update(diff); + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + Position pos = me->GetPosition(); + float maxRange = me->GetDistance2d(summon); + float angle = me->GetAbsoluteAngle(summon); + me->MovePositionToFirstCollision(pos, maxRange, angle); + summon->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + summon->ToTempSummon()->SetTempSummonType(TEMPSUMMON_CORPSE_DESPAWN); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BERSERK: - DoCastSelf(SPELL_BERSERK); - Talk(EMOTE_KELESETH_BERSERK); - break; - case EVENT_SHADOW_RESONANCE: - Talk(SAY_KELESETH_SPECIAL); - DoCastSelf(SPELL_SHADOW_RESONANCE); - events.Repeat(Seconds(10), Seconds(15)); - break; - case EVENT_SHADOW_LANCE: - _isEmpowered ? DoCastVictim(SPELL_EMPOWERED_SHADOW_LANCE) : DoCastVictim(SPELL_SHADOW_LANCE); - events.Repeat(Seconds(2)); - break; - default: - break; - } + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - // does not melee + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BERSERK: + DoCastSelf(SPELL_BERSERK); + Talk(EMOTE_KELESETH_BERSERK); + break; + case EVENT_SHADOW_RESONANCE: + Talk(SAY_KELESETH_SPECIAL); + DoCastSelf(SPELL_SHADOW_RESONANCE); + events.Repeat(Seconds(10), Seconds(15)); + break; + case EVENT_SHADOW_LANCE: + _isEmpowered ? DoCastVictim(SPELL_EMPOWERED_SHADOW_LANCE) : DoCastVictim(SPELL_SHADOW_LANCE); + events.Repeat(Seconds(2)); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI<boss_prince_kelesethAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + // does not melee + } }; -class boss_prince_taldaram_icc : public CreatureScript +struct boss_prince_taldaram_icc : public BloodPrincesBossAI { - public: - boss_prince_taldaram_icc() : CreatureScript("boss_prince_taldaram_icc") { } - - struct boss_prince_taldaramAI : public BloodPrincesBossAI - { - boss_prince_taldaramAI(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_TALDARAM) { } + boss_prince_taldaram_icc(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_TALDARAM) { } - void ScheduleEvents() override - { - events.ScheduleEvent(EVENT_BERSERK, 10min); - events.ScheduleEvent(EVENT_GLITTERING_SPARKS, 12s, 15s); - events.ScheduleEvent(EVENT_CONJURE_FLAME, 20s); - if (IsHeroic()) - DoCastSelf(SPELL_SHADOW_PRISON, true); - } + void ScheduleEvents() override + { + events.ScheduleEvent(EVENT_BERSERK, 10min); + events.ScheduleEvent(EVENT_GLITTERING_SPARKS, 12s, 15s); + events.ScheduleEvent(EVENT_CONJURE_FLAME, 20s); + if (IsHeroic()) + DoCastSelf(SPELL_SHADOW_PRISON, true); + } - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - Unit* target = SelectTarget(SelectTargetMethod::Random, 1, -10.0f, true); // first try at distance - if (!target) - target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // too bad for you raiders, its going to boom + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + Unit* target = SelectTarget(SelectTargetMethod::Random, 1, -10.0f, true); // first try at distance + if (!target) + target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // too bad for you raiders, its going to boom - if (summon->GetEntry() == NPC_BALL_OF_INFERNO_FLAME && target) - Talk(EMOTE_TALDARAM_FLAME, target); + if (summon->GetEntry() == NPC_BALL_OF_INFERNO_FLAME && target) + Talk(EMOTE_TALDARAM_FLAME, target); - if (target) - summon->AI()->SetGUID(target->GetGUID()); - } + if (target) + summon->AI()->SetGUID(target->GetGUID()); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BERSERK: + DoCastSelf(SPELL_BERSERK); + Talk(EMOTE_TALDARAM_BERSERK); + break; + case EVENT_GLITTERING_SPARKS: + DoCastVictim(SPELL_GLITTERING_SPARKS); + events.Repeat(Seconds(15), Seconds(50)); + break; + case EVENT_CONJURE_FLAME: + if (_isEmpowered) { - case EVENT_BERSERK: - DoCastSelf(SPELL_BERSERK); - Talk(EMOTE_TALDARAM_BERSERK); - break; - case EVENT_GLITTERING_SPARKS: - DoCastVictim(SPELL_GLITTERING_SPARKS); - events.Repeat(Seconds(15), Seconds(50)); - break; - case EVENT_CONJURE_FLAME: - if (_isEmpowered) - { - DoCastSelf(SPELL_CONJURE_EMPOWERED_FLAME); - events.Repeat(Seconds(15), Seconds(25)); - } - else - { - DoCastSelf(SPELL_CONJURE_FLAME); - events.Repeat(Seconds(20), Seconds(30)); - } - Talk(SAY_TALDARAM_SPECIAL); - break; - default: - break; + DoCastSelf(SPELL_CONJURE_EMPOWERED_FLAME); + events.Repeat(Seconds(15), Seconds(25)); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + else + { + DoCastSelf(SPELL_CONJURE_FLAME); + events.Repeat(Seconds(20), Seconds(30)); + } + Talk(SAY_TALDARAM_SPECIAL); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI<boss_prince_taldaramAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class boss_prince_valanar_icc : public CreatureScript +struct boss_prince_valanar_icc : public BloodPrincesBossAI { - public: - boss_prince_valanar_icc() : CreatureScript("boss_prince_valanar_icc") { } + boss_prince_valanar_icc(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_VALANAR) { } - struct boss_prince_valanarAI : public BloodPrincesBossAI - { - boss_prince_valanarAI(Creature* creature) : BloodPrincesBossAI(creature, DATA_PRINCE_VALANAR) { } + void ScheduleEvents() override + { + events.ScheduleEvent(EVENT_BERSERK, 10min); + events.ScheduleEvent(EVENT_KINETIC_BOMB, 18s, 24s); + events.ScheduleEvent(EVENT_SHOCK_VORTEX, 15s, 20s); + if (IsHeroic()) + DoCastSelf(SPELL_SHADOW_PRISON, true); + } - void ScheduleEvents() override + void JustSummoned(Creature* summon) override + { + switch (summon->GetEntry()) + { + case NPC_KINETIC_BOMB_TARGET: + summon->SetReactState(REACT_PASSIVE); + summon->CastSpell(summon, SPELL_KINETIC_BOMB, me->GetGUID()); + break; + case NPC_KINETIC_BOMB: { - events.ScheduleEvent(EVENT_BERSERK, 10min); - events.ScheduleEvent(EVENT_KINETIC_BOMB, 18s, 24s); - events.ScheduleEvent(EVENT_SHOCK_VORTEX, 15s, 20s); - if (IsHeroic()) - DoCastSelf(SPELL_SHADOW_PRISON, true); + float x, y, z; + summon->GetPosition(x, y, z); + float ground_Z = summon->GetMap()->GetHeight(summon->GetPhaseMask(), x, y, z, true, 500.0f); + summon->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, ground_Z); + summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + break; } + case NPC_SHOCK_VORTEX: + summon->CastSpell(summon, SPELL_SHOCK_VORTEX_DUMMY, true); + summon->m_Events.AddEvent(new VortexEvent(summon), summon->m_Events.CalculateTime(5s)); + break; + default: + break; + } - void JustSummoned(Creature* summon) override - { - switch (summon->GetEntry()) - { - case NPC_KINETIC_BOMB_TARGET: - summon->SetReactState(REACT_PASSIVE); - summon->CastSpell(summon, SPELL_KINETIC_BOMB, me->GetGUID()); - break; - case NPC_KINETIC_BOMB: - { - float x, y, z; - summon->GetPosition(x, y, z); - float ground_Z = summon->GetMap()->GetHeight(summon->GetPhaseMask(), x, y, z, true, 500.0f); - summon->GetMotionMaster()->MovePoint(POINT_KINETIC_BOMB_IMPACT, x, y, ground_Z); - summon->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - break; - } - case NPC_SHOCK_VORTEX: - summon->CastSpell(summon, SPELL_SHOCK_VORTEX_DUMMY, true); - summon->m_Events.AddEvent(new VortexEvent(summon), summon->m_Events.CalculateTime(5s)); - break; - default: - break; - } - - summons.Summon(summon); - if (me->IsInCombat()) - DoZoneInCombat(summon); - } + summons.Summon(summon); + if (me->IsInCombat()) + DoZoneInCombat(summon); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BERSERK: + DoCastSelf(SPELL_BERSERK); + Talk(SAY_VALANAR_BERSERK); + break; + case EVENT_KINETIC_BOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) { - case EVENT_BERSERK: - DoCastSelf(SPELL_BERSERK); - Talk(SAY_VALANAR_BERSERK); - break; - case EVENT_KINETIC_BOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - { - DoCast(target, SPELL_KINETIC_BOMB_TARGET); - Talk(SAY_VALANAR_SPECIAL); - } - events.Repeat(Seconds(18), Seconds(24)); - break; - case EVENT_SHOCK_VORTEX: - if (_isEmpowered) - { - DoCastSelf(SPELL_EMPOWERED_SHOCK_VORTEX); - Talk(EMOTE_VALANAR_SHOCK_VORTEX); - events.Repeat(Seconds(30)); - } - else - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - DoCast(target, SPELL_SHOCK_VORTEX); - events.Repeat(Seconds(18), Seconds(23)); - } - break; - default: - break; + DoCast(target, SPELL_KINETIC_BOMB_TARGET); + Talk(SAY_VALANAR_SPECIAL); } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + events.Repeat(Seconds(18), Seconds(24)); + break; + case EVENT_SHOCK_VORTEX: + if (_isEmpowered) + { + DoCastSelf(SPELL_EMPOWERED_SHOCK_VORTEX); + Talk(EMOTE_VALANAR_SHOCK_VORTEX); + events.Repeat(Seconds(30)); + } + else + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) + DoCast(target, SPELL_SHOCK_VORTEX); + events.Repeat(Seconds(18), Seconds(23)); + } + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI<boss_prince_valanarAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class npc_blood_queen_lana_thel : public CreatureScript +struct npc_blood_queen_lana_thel : public PassiveAI { - public: - npc_blood_queen_lana_thel() : CreatureScript("npc_blood_queen_lana_thel") { } - - struct npc_blood_queen_lana_thelAI : public PassiveAI - { - npc_blood_queen_lana_thelAI(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { } + npc_blood_queen_lana_thel(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()) { } - void Reset() override - { - _events.Reset(); - me->SetDisableGravity(true); - _instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE ? me->SetVisible(true) : me->SetVisible(false); - } + void Reset() override + { + _events.Reset(); + me->SetDisableGravity(true); + _instance->GetBossState(DATA_BLOOD_PRINCE_COUNCIL) != DONE ? me->SetVisible(true) : me->SetVisible(false); + } - void DoAction(int32 action) override - { - switch (action) + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_START_INTRO: + Talk(SAY_INTRO_1); + _events.SetPhase(1); + _events.ScheduleEvent(EVENT_INTRO_1, Seconds(14)); + // summon a visual trigger + if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15s, TEMPSUMMON_TIMED_DESPAWN)) { - case ACTION_START_INTRO: - Talk(SAY_INTRO_1); - _events.SetPhase(1); - _events.ScheduleEvent(EVENT_INTRO_1, Seconds(14)); - // summon a visual trigger - if (Creature* summon = DoSummon(NPC_FLOATING_TRIGGER, triggerPos, 15s, TEMPSUMMON_TIMED_DESPAWN)) - { - summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); - summon->SetSpeedRate(MOVE_RUN, 0.14f); - summon->GetMotionMaster()->MovePoint(0, triggerEndPos); - } - break; - default: - break; + summon->CastSpell(summon, SPELL_OOC_INVOCATION_VISUAL, true); + summon->SetSpeedRate(MOVE_RUN, 0.14f); + summon->GetMotionMaster()->MovePoint(0, triggerEndPos); } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE && id == POINT_INTRO_DESPAWN) - me->SetVisible(false); - } - - void UpdateAI(uint32 diff) override - { - if (!_events.GetPhaseMask()) - return; - - _events.Update(diff); + break; + default: + break; + } + } - if (_events.ExecuteEvent() == EVENT_INTRO_1) - { - Talk(SAY_INTRO_2); - me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos); - _events.Reset(); + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE && id == POINT_INTRO_DESPAWN) + me->SetVisible(false); + } - if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BLOOD_PRINCES_CONTROL))) - controller->AI()->DoAction(ACTION_INTRO_DONE); - } - } + void UpdateAI(uint32 diff) override + { + if (!_events.GetPhaseMask()) + return; - private: - EventMap _events; - InstanceScript* _instance; - }; + _events.Update(diff); - CreatureAI* GetAI(Creature* creature) const override + if (_events.ExecuteEvent() == EVENT_INTRO_1) { - return GetIcecrownCitadelAI<npc_blood_queen_lana_thelAI>(creature); + Talk(SAY_INTRO_2); + me->GetMotionMaster()->MovePoint(POINT_INTRO_DESPAWN, introFinalPos); + _events.Reset(); + + if (Creature* controller = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_BLOOD_PRINCES_CONTROL))) + controller->AI()->DoAction(ACTION_INTRO_DONE); } + } + +private: + EventMap _events; + InstanceScript* _instance; }; -class npc_ball_of_flame : public CreatureScript +struct npc_ball_of_flame : public ScriptedAI { - public: - npc_ball_of_flame() : CreatureScript("npc_ball_of_flame") { } + npc_ball_of_flame(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } - struct npc_ball_of_flameAI : public ScriptedAI + void Reset() override + { + DoCastSelf(SPELL_FLAME_SPHERE_SPAWN_EFFECT, true); + DoCastSelf(SPELL_BALL_OF_FLAMES_VISUAL, true); + if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) { - npc_ball_of_flameAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { } - - void Reset() override - { - DoCastSelf(SPELL_FLAME_SPHERE_SPAWN_EFFECT, true); - DoCastSelf(SPELL_BALL_OF_FLAMES_VISUAL, true); - if (me->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) - { - DoCastSelf(SPELL_BALL_OF_FLAMES_PROC, true); - DoCastSelf(SPELL_BALL_OF_FLAMES_PERIODIC, true); - } - } + DoCastSelf(SPELL_BALL_OF_FLAMES_PROC, true); + DoCastSelf(SPELL_BALL_OF_FLAMES_PERIODIC, true); + } + } - void MovementInform(uint32 type, uint32 id) override + void MovementInform(uint32 type, uint32 id) override + { + if (type == CHASE_MOTION_TYPE && id == _chaseGUID.GetCounter() && _chaseGUID) + { + me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC); + DoCastSelf(SPELL_FLAMES); + _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/) { - if (type == CHASE_MOTION_TYPE && id == _chaseGUID.GetCounter() && _chaseGUID) - { - me->RemoveAurasDueToSpell(SPELL_BALL_OF_FLAMES_PERIODIC); - DoCastSelf(SPELL_FLAMES); - _scheduler.Schedule(Seconds(2), [this](TaskContext /*context*/) - { - DoCastSelf(SPELL_FLAME_SPHERE_DEATH_EFFECT); - }); - _chaseGUID.Clear(); - } - } + DoCastSelf(SPELL_FLAME_SPHERE_DEATH_EFFECT); + }); + _chaseGUID.Clear(); + } + } - void SetGUID(ObjectGuid const& guid, int32 /*id*/) override - { - _chaseGUID = guid; - } + void SetGUID(ObjectGuid const& guid, int32 /*id*/) override + { + _chaseGUID = guid; + } - void DoAction(int32 action) override + void DoAction(int32 action) override + { + if (action == ACTION_FLAME_BALL_CHASE) + if (Player* target = ObjectAccessor::GetPlayer(*me, _chaseGUID)) { - if (action == ACTION_FLAME_BALL_CHASE) - if (Player* target = ObjectAccessor::GetPlayer(*me, _chaseGUID)) - { - // need to clear states now because this call is before AuraEffect is fully removed - me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); - if (me->Attack(target, true)) - me->GetMotionMaster()->MoveChase(target, 1.0f); - } + // need to clear states now because this call is before AuraEffect is fully removed + me->ClearUnitState(UNIT_STATE_CASTING | UNIT_STATE_STUNNED); + if (me->Attack(target, true)) + me->GetMotionMaster()->MoveChase(target, 1.0f); } + } - void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) override - { - if (damageType != SPELL_DIRECT_DAMAGE) - return; - - if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000)) - _instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false)); - } + void DamageDealt(Unit* /*target*/, uint32& damage, DamageEffectType damageType) override + { + if (damageType != SPELL_DIRECT_DAMAGE) + return; - void UpdateAI(uint32 diff) override - { - _scheduler.Update(diff); - } + if (damage > RAID_MODE<uint32>(23000, 25000, 23000, 25000)) + _instance->SetData(DATA_ORB_WHISPERER_ACHIEVEMENT, uint32(false)); + } - private: - ObjectGuid _chaseGUID; - InstanceScript* _instance; - TaskScheduler _scheduler; - }; + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI<npc_ball_of_flameAI>(creature); - } +private: + ObjectGuid _chaseGUID; + InstanceScript* _instance; + TaskScheduler _scheduler; }; -class npc_kinetic_bomb : public CreatureScript +struct npc_kinetic_bomb : public ScriptedAI { - public: - npc_kinetic_bomb() : CreatureScript("npc_kinetic_bomb") { } - - struct npc_kinetic_bombAI : public ScriptedAI - { - npc_kinetic_bombAI(Creature* creature) : ScriptedAI(creature), _x(0.f), _y(0.f), _groundZ(0.f) { } + npc_kinetic_bomb(Creature* creature) : ScriptedAI(creature), _x(0.f), _y(0.f), _groundZ(0.f) { } - void Reset() override - { - _events.Reset(); - me->SetWalk(true); - DoCastSelf(SPELL_UNSTABLE, true); - DoCastSelf(SPELL_KINETIC_BOMB_VISUAL, true); - me->SetReactState(REACT_PASSIVE); - me->GetPosition(_x, _y, _groundZ); - me->DespawnOrUnsummon(60s); - _groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), _x, _y, _groundZ, true, 500.0f); - } - - void DoAction(int32 action) override - { - if (action == SPELL_KINETIC_BOMB_EXPLOSION) - _events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1s); + void Reset() override + { + _events.Reset(); + me->SetWalk(true); + DoCastSelf(SPELL_UNSTABLE, true); + DoCastSelf(SPELL_KINETIC_BOMB_VISUAL, true); + me->SetReactState(REACT_PASSIVE); + me->GetPosition(_x, _y, _groundZ); + me->DespawnOrUnsummon(60s); + _groundZ = me->GetMap()->GetHeight(me->GetPhaseMask(), _x, _y, _groundZ, true, 500.0f); + } - else if (action == ACTION_KINETIC_BOMB_JUMP) - { - if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK)) - { - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 100.0f, me->GetSpeed(MOVE_RUN), POINT_KINETIC_BOMB_IMPACT); - } - _events.RescheduleEvent(EVENT_CONTINUE_FALLING, Seconds(3)); - } - } + void DoAction(int32 action) override + { + if (action == SPELL_KINETIC_BOMB_EXPLOSION) + _events.ScheduleEvent(EVENT_BOMB_DESPAWN, 1s); - void UpdateAI(uint32 diff) override + else if (action == ACTION_KINETIC_BOMB_JUMP) + { + if (!me->HasAura(SPELL_KINETIC_BOMB_KNOCKBACK)) { - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BOMB_DESPAWN: - me->SetVisible(false); - me->DespawnOrUnsummon(5s); - break; - case EVENT_CONTINUE_FALLING: - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_RUN), POINT_KINETIC_BOMB_IMPACT); - break; - default: - break; - } - } + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveCharge(_x, _y, me->GetPositionZ() + 100.0f, me->GetSpeed(MOVE_RUN), POINT_KINETIC_BOMB_IMPACT); } + _events.RescheduleEvent(EVENT_CONTINUE_FALLING, Seconds(3)); + } + } - private: - EventMap _events; - float _x; - float _y; - float _groundZ; - }; + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - CreatureAI* GetAI(Creature* creature) const override + while (uint32 eventId = _events.ExecuteEvent()) { - return GetIcecrownCitadelAI<npc_kinetic_bombAI>(creature); + switch (eventId) + { + case EVENT_BOMB_DESPAWN: + me->SetVisible(false); + me->DespawnOrUnsummon(5s); + break; + case EVENT_CONTINUE_FALLING: + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveCharge(_x, _y, _groundZ, me->GetSpeed(MOVE_RUN), POINT_KINETIC_BOMB_IMPACT); + break; + default: + break; + } } + } + +private: + EventMap _events; + float _x; + float _y; + float _groundZ; }; -class npc_dark_nucleus : public CreatureScript +struct npc_dark_nucleus : public ScriptedAI { - public: - npc_dark_nucleus() : CreatureScript("npc_dark_nucleus") { } + npc_dark_nucleus(Creature* creature) : ScriptedAI(creature) { } - struct npc_dark_nucleusAI : public ScriptedAI - { - npc_dark_nucleusAI(Creature* creature) : ScriptedAI(creature) { } + void Reset() override + { + me->SetReactState(REACT_DEFENSIVE); + DoCastSelf(SPELL_SHADOW_RESONANCE_AURA, true); + } - void Reset() override + void JustEngagedWith(Unit* who) override + { + _scheduler.Schedule(Seconds(1), [this](TaskContext targetAuraCheck) + { + if (Unit* victim = me->GetVictim()) { - me->SetReactState(REACT_DEFENSIVE); - DoCastSelf(SPELL_SHADOW_RESONANCE_AURA, true); + if (me->GetDistance(victim) < 15.0f && !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) + DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); + else + MoveInLineOfSight(me->GetVictim()); } + targetAuraCheck.Repeat(); + }); - void JustEngagedWith(Unit* who) override - { - _scheduler.Schedule(Seconds(1), [this](TaskContext targetAuraCheck) - { - if (Unit* victim = me->GetVictim()) - { - if (me->GetDistance(victim) < 15.0f && !victim->HasAura(SPELL_SHADOW_RESONANCE_RESIST, me->GetGUID())) - DoCast(victim, SPELL_SHADOW_RESONANCE_RESIST); - else - MoveInLineOfSight(me->GetVictim()); - } - targetAuraCheck.Repeat(); - }); - - if (me->GetDistance(who) >= 15.0f) - { - DoStartMovement(who); - return; - } - - DoCast(who, SPELL_SHADOW_RESONANCE_RESIST); - } + if (me->GetDistance(who) >= 15.0f) + { + DoStartMovement(who); + return; + } - void DamageTaken(Unit* attacker, uint32& /*damage*/) override - { - if (attacker == me) - return; + DoCast(who, SPELL_SHADOW_RESONANCE_RESIST); + } - me->GetThreatManager().ResetAllThreat(); - AddThreat(attacker, 500000000.0f); - } + void DamageTaken(Unit* attacker, uint32& /*damage*/) override + { + if (attacker == me) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + me->GetThreatManager().ResetAllThreat(); + AddThreat(attacker, 500000000.0f); + } - _scheduler.Update(diff); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - private: - TaskScheduler _scheduler; - }; + _scheduler.Update(diff); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetIcecrownCitadelAI<npc_dark_nucleusAI>(creature); - } +private: + TaskScheduler _scheduler; }; // 71806 - Glittering Sparks -class spell_taldaram_glittering_sparks : public SpellScriptLoader +class spell_taldaram_glittering_sparks : public SpellScript { - public: - spell_taldaram_glittering_sparks() : SpellScriptLoader("spell_taldaram_glittering_sparks") { } + PrepareSpellScript(spell_taldaram_glittering_sparks); - class spell_taldaram_glittering_sparks_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_glittering_sparks_SpellScript); - - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_glittering_sparks_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_glittering_sparks::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; /* 71718 - Conjure Flame 72040 - Conjure Empowered Flame */ -class spell_taldaram_summon_flame_ball : public SpellScriptLoader +class spell_taldaram_summon_flame_ball : public SpellScript { - public: - spell_taldaram_summon_flame_ball() : SpellScriptLoader("spell_taldaram_summon_flame_ball") { } - - class spell_taldaram_summon_flame_ball_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_summon_flame_ball_SpellScript); + PrepareSpellScript(spell_taldaram_summon_flame_ball); - void HandleScript(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + void HandleScript(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_summon_flame_ball_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_taldaram_summon_flame_ball::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; /* 55891 - Flame Sphere Spawn Effect 55947 - Flame Sphere Death Effect */ -class spell_taldaram_flame_ball_visual : public SpellScriptLoader +class spell_taldaram_flame_ball_visual : public AuraScript { - public: - spell_taldaram_flame_ball_visual() : SpellScriptLoader("spell_taldaram_flame_ball_visual") { } - - class spell_flame_ball_visual_AuraScript : public AuraScript - { - PrepareAuraScript(spell_flame_ball_visual_AuraScript); - - bool Load() override - { - if (GetCaster()->GetEntry() == NPC_BALL_OF_FLAME || GetCaster()->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) - return true; - return false; - } + PrepareAuraScript(spell_taldaram_flame_ball_visual); - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_BALL_OF_FLAMES }); - } - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Creature* target = GetTarget()->ToCreature(); - if (!target) - return; + bool Load() override + { + if (GetCaster()->GetEntry() == NPC_BALL_OF_FLAME || GetCaster()->GetEntry() == NPC_BALL_OF_INFERNO_FLAME) + return true; + return false; + } - // SPELL_FLAME_SPHERE_SPAWN_EFFECT - if (GetSpellInfo()->Id == SPELL_FLAME_SPHERE_SPAWN_EFFECT) - { - target->CastSpell(target, SPELL_BALL_OF_FLAMES, true); - target->AI()->DoAction(ACTION_FLAME_BALL_CHASE); - } - else // SPELL_FLAME_SPHERE_DEATH_EFFECT - target->DespawnOrUnsummon(); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_BALL_OF_FLAMES }); + } - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_flame_ball_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Creature* target = GetTarget()->ToCreature(); + if (!target) + return; - AuraScript* GetAuraScript() const override + // SPELL_FLAME_SPHERE_SPAWN_EFFECT + if (GetSpellInfo()->Id == SPELL_FLAME_SPHERE_SPAWN_EFFECT) { - return new spell_flame_ball_visual_AuraScript(); + target->CastSpell(target, SPELL_BALL_OF_FLAMES, true); + target->AI()->DoAction(ACTION_FLAME_BALL_CHASE); } + else // SPELL_FLAME_SPHERE_DEATH_EFFECT + target->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_taldaram_flame_ball_visual::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } }; /* 71756 - Ball of Flames Proc 72782 - Ball of Flames Proc 72783 - Ball of Flames Proc 72784 - Ball of Flames Proc */ -class spell_taldaram_ball_of_inferno_flame : public SpellScriptLoader +class spell_taldaram_ball_of_inferno_flame : public SpellScript { - public: - spell_taldaram_ball_of_inferno_flame() : SpellScriptLoader("spell_taldaram_ball_of_inferno_flame") { } - - class spell_taldaram_ball_of_inferno_flame_SpellScript : public SpellScript - { - PrepareSpellScript(spell_taldaram_ball_of_inferno_flame_SpellScript); - - void ModAuraStack() - { - if (Aura* aur = GetHitAura()) - aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); - } + PrepareSpellScript(spell_taldaram_ball_of_inferno_flame); - void Register() override - { - AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame_SpellScript::ModAuraStack); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_taldaram_ball_of_inferno_flame_SpellScript(); - } + void ModAuraStack() + { + if (Aura* aur = GetHitAura()) + aur->SetStackAmount(uint8(GetSpellInfo()->StackAmount)); + } - class spell_taldaram_ball_of_inferno_flame_AuraScript : public AuraScript - { - PrepareAuraScript(spell_taldaram_ball_of_inferno_flame_AuraScript); + void Register() override + { + AfterHit += SpellHitFn(spell_taldaram_ball_of_inferno_flame::ModAuraStack); + } +}; - void HandleStackDrop(ProcEventInfo& /*eventInfo*/) - { - ModStackAmount(-1); - } +class spell_taldaram_ball_of_inferno_flame_aura : public AuraScript +{ + PrepareAuraScript(spell_taldaram_ball_of_inferno_flame_aura); - void Register() override - { - OnProc += AuraProcFn(spell_taldaram_ball_of_inferno_flame_AuraScript::HandleStackDrop); - } - }; + void HandleStackDrop(ProcEventInfo& /*eventInfo*/) + { + ModStackAmount(-1); + } - AuraScript* GetAuraScript() const override - { - return new spell_taldaram_ball_of_inferno_flame_AuraScript(); - } + void Register() override + { + OnProc += AuraProcFn(spell_taldaram_ball_of_inferno_flame_aura::HandleStackDrop); + } }; // 72080 - Kinetic Bomb -class spell_valanar_kinetic_bomb : public SpellScriptLoader +class spell_valanar_kinetic_bomb : public SpellScript { - public: - spell_valanar_kinetic_bomb() : SpellScriptLoader("spell_valanar_kinetic_bomb") { } - - class spell_valanar_kinetic_bomb_SpellScript : public SpellScript - { - PrepareSpellScript(spell_valanar_kinetic_bomb_SpellScript); + PrepareSpellScript(spell_valanar_kinetic_bomb); - void SetDest(SpellDestination& dest) - { - Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() override - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_valanar_kinetic_bomb_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER); - } - }; - - class spell_valanar_kinetic_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_valanar_kinetic_bomb_AuraScript); + void SetDest(SpellDestination& dest) + { + Position const offset = { 0.0f, 0.0f, 20.0f, 0.0f }; + dest.RelocateOffset(offset); + } - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_KINETIC_BOMB_EXPLOSION, SPELL_KINETIC_BOMB_VISUAL }); - } + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_valanar_kinetic_bomb::SetDest, EFFECT_0, TARGET_DEST_CASTER); + } +}; - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - Unit* target = GetTarget(); - if (target->GetTypeId() != TYPEID_UNIT) - return; +class spell_valanar_kinetic_bomb_aura : public AuraScript +{ + PrepareAuraScript(spell_valanar_kinetic_bomb_aura); - if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) - { - bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); - bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); - target->RemoveAura(GetAura()); - bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); - } - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_KINETIC_BOMB_EXPLOSION, SPELL_KINETIC_BOMB_VISUAL }); + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_AuraScript::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + Unit* target = GetTarget(); + if (target->GetTypeId() != TYPEID_UNIT) + return; - SpellScript* GetSpellScript() const override + if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 1.0f, true)) { - return new spell_valanar_kinetic_bomb_SpellScript(); + bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); + bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); + target->RemoveAura(GetAura()); + bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); } + } - AuraScript* GetAuraScript() const override - { - return new spell_valanar_kinetic_bomb_AuraScript(); - } + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_valanar_kinetic_bomb_aura::HandleDummyTick, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); + } }; // 72087 - Kinetic Bomb Knockback -class spell_valanar_kinetic_bomb_knockback : public SpellScriptLoader +class spell_valanar_kinetic_bomb_knockback : public SpellScript { - public: - spell_valanar_kinetic_bomb_knockback() : SpellScriptLoader("spell_valanar_kinetic_bomb_knockback") { } - - class spell_valanar_kinetic_bomb_knockback_SpellScript : public SpellScript - { - PrepareSpellScript(spell_valanar_kinetic_bomb_knockback_SpellScript); + PrepareSpellScript(spell_valanar_kinetic_bomb_knockback); - void KnockIntoAir(SpellMissInfo missInfo) - { - if (missInfo != SPELL_MISS_NONE) - return; - - if (Creature* target = GetHitCreature()) - target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); - } + void KnockIntoAir(SpellMissInfo missInfo) + { + if (missInfo != SPELL_MISS_NONE) + return; - void Register() override - { - BeforeHit += BeforeSpellHitFn(spell_valanar_kinetic_bomb_knockback_SpellScript::KnockIntoAir); - } - }; + if (Creature* target = GetHitCreature()) + target->AI()->DoAction(ACTION_KINETIC_BOMB_JUMP); + } - SpellScript* GetSpellScript() const override - { - return new spell_valanar_kinetic_bomb_knockback_SpellScript(); - } + void Register() override + { + BeforeHit += BeforeSpellHitFn(spell_valanar_kinetic_bomb_knockback::KnockIntoAir); + } }; // 72054 - Kinetic Bomb Visual -class spell_valanar_kinetic_bomb_absorb : public SpellScriptLoader +class spell_valanar_kinetic_bomb_absorb : public AuraScript { - public: - spell_valanar_kinetic_bomb_absorb() : SpellScriptLoader("spell_valanar_kinetic_bomb_absorb") { } + PrepareAuraScript(spell_valanar_kinetic_bomb_absorb); - class spell_valanar_kinetic_bomb_absorb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_valanar_kinetic_bomb_absorb_AuraScript); - - void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); - RoundToInterval<uint32>(absorbAmount, 0, dmgInfo.GetDamage()); - dmgInfo.AbsorbDamage(absorbAmount); - } - - void Register() override - { - OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb_AuraScript::OnAbsorb, EFFECT_0); - } - }; + void OnAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + { + absorbAmount = CalculatePct(dmgInfo.GetDamage(), aurEff->GetAmount()); + RoundToInterval<uint32>(absorbAmount, 0, dmgInfo.GetDamage()); + dmgInfo.AbsorbDamage(absorbAmount); + } - AuraScript* GetAuraScript() const override - { - return new spell_valanar_kinetic_bomb_absorb_AuraScript(); - } + void Register() override + { + OnEffectAbsorb += AuraEffectAbsorbFn(spell_valanar_kinetic_bomb_absorb::OnAbsorb, EFFECT_0); + } }; // 73001 - Shadow Prison -class spell_blood_council_shadow_prison : public SpellScriptLoader +class spell_blood_council_shadow_prison : public AuraScript { - public: - spell_blood_council_shadow_prison() : SpellScriptLoader("spell_blood_council_shadow_prison") { } + PrepareAuraScript(spell_blood_council_shadow_prison); - class spell_blood_council_shadow_prison_AuraScript : public AuraScript - { - PrepareAuraScript(spell_blood_council_shadow_prison_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_SHADOW_PRISON_DAMAGE }); - } - - void HandleDummyTick(AuraEffect const* aurEff) - { - if (GetTarget()->isMoving()) - GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, aurEff); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_SHADOW_PRISON_DAMAGE }); + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; + void HandleDummyTick(AuraEffect const* aurEff) + { + if (GetTarget()->isMoving()) + GetTarget()->CastSpell(GetTarget(), SPELL_SHADOW_PRISON_DAMAGE, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_blood_council_shadow_prison_AuraScript(); - } + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_blood_council_shadow_prison::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } }; // 72999 - Shadow Prison -class spell_blood_council_shadow_prison_damage : public SpellScriptLoader +class spell_blood_council_shadow_prison_damage : public SpellScript { - public: - spell_blood_council_shadow_prison_damage() : SpellScriptLoader("spell_blood_council_shadow_prison_damage") { } - - class spell_blood_council_shadow_prison_SpellScript : public SpellScript - { - PrepareSpellScript(spell_blood_council_shadow_prison_SpellScript); - - void AddExtraDamage(SpellEffIndex /*effIndex*/) - { - if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) - if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) - SetEffectValue(GetEffectValue() + eff->GetAmount()); - } + PrepareSpellScript(spell_blood_council_shadow_prison_damage); - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_blood_council_shadow_prison_SpellScript::AddExtraDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; + void AddExtraDamage(SpellEffIndex /*effIndex*/) + { + if (Aura* aur = GetHitUnit()->GetAura(GetSpellInfo()->Id)) + if (AuraEffect const* eff = aur->GetEffect(EFFECT_1)) + SetEffectValue(GetEffectValue() + eff->GetAmount()); + } - SpellScript* GetSpellScript() const override - { - return new spell_blood_council_shadow_prison_SpellScript(); - } + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_blood_council_shadow_prison_damage::AddExtraDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; class at_blood_prince_council_start_intro : public AreaTriggerScript @@ -1540,22 +1343,27 @@ class at_blood_prince_council_start_intro : public AreaTriggerScript void AddSC_boss_blood_prince_council() { - new boss_blood_council_controller(); - new boss_prince_keleseth_icc(); - new boss_prince_taldaram_icc(); - new boss_prince_valanar_icc(); - new npc_blood_queen_lana_thel(); - new npc_ball_of_flame(); - new npc_kinetic_bomb(); - new npc_dark_nucleus(); - new spell_taldaram_glittering_sparks(); - new spell_taldaram_summon_flame_ball(); - new spell_taldaram_flame_ball_visual(); - new spell_taldaram_ball_of_inferno_flame(); - new spell_valanar_kinetic_bomb(); - new spell_valanar_kinetic_bomb_knockback(); - new spell_valanar_kinetic_bomb_absorb(); - new spell_blood_council_shadow_prison(); - new spell_blood_council_shadow_prison_damage(); + // Creatures + RegisterIcecrownCitadelCreatureAI(boss_blood_council_controller); + RegisterIcecrownCitadelCreatureAI(boss_prince_keleseth_icc); + RegisterIcecrownCitadelCreatureAI(boss_prince_taldaram_icc); + RegisterIcecrownCitadelCreatureAI(boss_prince_valanar_icc); + RegisterIcecrownCitadelCreatureAI(npc_blood_queen_lana_thel); + RegisterIcecrownCitadelCreatureAI(npc_ball_of_flame); + RegisterIcecrownCitadelCreatureAI(npc_kinetic_bomb); + RegisterIcecrownCitadelCreatureAI(npc_dark_nucleus); + + // Spells + RegisterSpellScript(spell_taldaram_glittering_sparks); + RegisterSpellScript(spell_taldaram_summon_flame_ball); + RegisterSpellScript(spell_taldaram_flame_ball_visual); + RegisterSpellAndAuraScriptPair(spell_taldaram_ball_of_inferno_flame, spell_taldaram_ball_of_inferno_flame_aura); + RegisterSpellAndAuraScriptPair(spell_valanar_kinetic_bomb, spell_valanar_kinetic_bomb_aura); + RegisterSpellScript(spell_valanar_kinetic_bomb_knockback); + RegisterSpellScript(spell_valanar_kinetic_bomb_absorb); + RegisterSpellScript(spell_blood_council_shadow_prison); + RegisterSpellScript(spell_blood_council_shadow_prison_damage); + + // AreaTriggers new at_blood_prince_council_start_intro(); } |