aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_blood_prince_council.cpp1652
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();
}