aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp572
-rw-r--r--src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp314
2 files changed, 410 insertions, 476 deletions
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
index 40a1d7f7b43..5b63c77bffc 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp
@@ -125,351 +125,307 @@ enum Misc
DATA_THREE_FACED = 1
};
-class boss_devourer_of_souls : public CreatureScript
+struct boss_devourer_of_souls : public BossAI
{
- public:
- boss_devourer_of_souls() : CreatureScript("boss_devourer_of_souls") { }
-
- struct boss_devourer_of_soulsAI : public BossAI
+ boss_devourer_of_souls(Creature* creature) : BossAI(creature, DATA_DEVOURER_OF_SOULS)
+ {
+ Initialize();
+ beamAngle = 0.f;
+ beamAngleDiff = 0.f;
+ wailingSoulTick = 0;
+ }
+
+ void Initialize()
+ {
+ threeFaced = true;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ me->SetControlled(false, UNIT_STATE_ROOT);
+ me->SetDisplayId(DISPLAY_ANGER);
+ me->SetReactState(REACT_AGGRESSIVE);
+
+ Initialize();
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_FACE_AGGRO);
+
+ if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 60)) // Prevent double spawn
+ instance->instance->SummonCreature(NPC_CRUCIBLE_OF_SOULS, CrucibleSummonPos);
+ events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s);
+ events.ScheduleEvent(EVENT_MIRRORED_SOUL, 8s);
+ events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30s);
+ events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20s);
+ events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s);
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() != TYPEID_PLAYER)
+ return;
+
+ uint8 textId = 0;
+ switch (me->GetDisplayId())
{
- boss_devourer_of_soulsAI(Creature* creature) : BossAI(creature, DATA_DEVOURER_OF_SOULS)
- {
- Initialize();
- beamAngle = 0.f;
- beamAngleDiff = 0.f;
- wailingSoulTick = 0;
- }
+ case DISPLAY_ANGER:
+ textId = SAY_FACE_ANGER_SLAY;
+ break;
+ case DISPLAY_SORROW:
+ textId = SAY_FACE_SORROW_SLAY;
+ break;
+ case DISPLAY_DESIRE:
+ textId = SAY_FACE_DESIRE_SLAY;
+ break;
+ default:
+ break;
+ }
- void Initialize()
- {
- threeFaced = true;
- }
+ if (textId)
+ Talk(textId);
+ }
- void Reset() override
- {
- _Reset();
- me->SetControlled(false, UNIT_STATE_ROOT);
- me->SetDisplayId(DISPLAY_ANGER);
- me->SetReactState(REACT_AGGRESSIVE);
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
- Initialize();
- }
+ Position spawnPoint = {5618.139f, 2451.873f, 705.854f, 0};
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_FACE_AGGRO);
-
- if (!me->FindNearestCreature(NPC_CRUCIBLE_OF_SOULS, 60)) // Prevent double spawn
- instance->instance->SummonCreature(NPC_CRUCIBLE_OF_SOULS, CrucibleSummonPos);
- events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s);
- events.ScheduleEvent(EVENT_MIRRORED_SOUL, 8s);
- events.ScheduleEvent(EVENT_WELL_OF_SOULS, 30s);
- events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 20s);
- events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s);
- }
+ Talk(SAY_FACE_DEATH);
- void KilledUnit(Unit* victim) override
+ int32 entryIndex;
+ if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
+ entryIndex = 0;
+ else
+ entryIndex = 1;
+
+ for (int8 i = 0; outroPositions[i].entry[entryIndex] != 0; ++i)
+ {
+ if (TempSummon* summon = instance->instance->SummonCreature(outroPositions[i].entry[entryIndex], spawnPoint))
{
- if (victim->GetTypeId() != TYPEID_PLAYER)
- return;
-
- uint8 textId = 0;
- switch (me->GetDisplayId())
- {
- case DISPLAY_ANGER:
- textId = SAY_FACE_ANGER_SLAY;
- break;
- case DISPLAY_SORROW:
- textId = SAY_FACE_SORROW_SLAY;
- break;
- case DISPLAY_DESIRE:
- textId = SAY_FACE_DESIRE_SLAY;
- break;
- default:
- break;
- }
-
- if (textId)
- Talk(textId);
+ summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
+ summon->GetMotionMaster()->MovePoint(0, outroPositions[i].movePosition);
+ if (summon->GetEntry() == NPC_JAINA_PART2)
+ summon->AI()->Talk(SAY_JAINA_OUTRO);
+ else if (summon->GetEntry() == NPC_SYLVANAS_PART2)
+ summon->AI()->Talk(SAY_SYLVANAS_OUTRO);
}
+ }
+ }
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
+ void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == H_SPELL_PHANTOM_BLAST)
+ threeFaced = false;
+ }
+
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_THREE_FACED)
+ return threeFaced;
+
+ return 0;
+ }
- Position spawnPoint = {5618.139f, 2451.873f, 705.854f, 0};
+ void UpdateAI(uint32 diff) override
+ {
+ // Return since we have no target
+ if (!UpdateVictim())
+ return;
- Talk(SAY_FACE_DEATH);
+ events.Update(diff);
- int32 entryIndex;
- if (instance->GetData(DATA_TEAM_IN_INSTANCE) == ALLIANCE)
- entryIndex = 0;
- else
- entryIndex = 1;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- for (int8 i = 0; outroPositions[i].entry[entryIndex] != 0; ++i)
- {
- if (TempSummon* summon = instance->instance->SummonCreature(outroPositions[i].entry[entryIndex], spawnPoint))
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_PHANTOM_BLAST:
+ DoCastVictim(SPELL_PHANTOM_BLAST);
+ events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s);
+ break;
+ case EVENT_MIRRORED_SOUL:
+ DoCastAOE(SPELL_MIRRORED_SOUL_TARGET_SELECTOR);
+ Talk(EMOTE_MIRRORED_SOUL);
+ events.ScheduleEvent(EVENT_MIRRORED_SOUL, 15s, 30s);
+ break;
+ case EVENT_WELL_OF_SOULS:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_WELL_OF_SOULS);
+ events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20s);
+ break;
+ case EVENT_UNLEASHED_SOULS:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_UNLEASHED_SOULS);
+ me->SetDisplayId(DISPLAY_SORROW);
+ Talk(SAY_FACE_UNLEASH_SOUL);
+ Talk(EMOTE_UNLEASH_SOUL);
+ events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30s);
+ events.ScheduleEvent(EVENT_FACE_ANGER, 5s);
+ break;
+ case EVENT_FACE_ANGER:
+ me->SetDisplayId(DISPLAY_ANGER);
+ break;
+
+ case EVENT_WAILING_SOULS:
+ me->SetDisplayId(DISPLAY_DESIRE);
+ Talk(SAY_FACE_WAILING_SOUL);
+ Talk(EMOTE_WAILING_SOUL);
+ DoCast(me, SPELL_WAILING_SOULS_STARTING);
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
{
- summon->SetTempSummonType(TEMPSUMMON_DEAD_DESPAWN);
- summon->GetMotionMaster()->MovePoint(0, outroPositions[i].movePosition);
- if (summon->GetEntry() == NPC_JAINA_PART2)
- summon->AI()->Talk(SAY_JAINA_OUTRO);
- else if (summon->GetEntry() == NPC_SYLVANAS_PART2)
- summon->AI()->Talk(SAY_SYLVANAS_OUTRO);
+ me->SetFacingToObject(target);
+ DoCast(me, SPELL_WAILING_SOULS_BEAM);
}
- }
- }
- void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
- {
- if (spellInfo->Id == H_SPELL_PHANTOM_BLAST)
- threeFaced = false;
- }
+ beamAngle = me->GetOrientation();
- uint32 GetData(uint32 type) const override
- {
- if (type == DATA_THREE_FACED)
- return threeFaced;
+ beamAngleDiff = float(M_PI)/30.0f; // PI/2 in 15 sec = PI/30 per tick
+ if (RAND(true, false))
+ beamAngleDiff = -beamAngleDiff;
- return 0;
- }
+ me->InterruptNonMeleeSpells(false);
+ me->SetReactState(REACT_PASSIVE);
- void UpdateAI(uint32 diff) override
- {
- // Return since we have no target
- if (!UpdateVictim())
- return;
+ //Remove any target
+ me->SetTarget(ObjectGuid::Empty);
- events.Update(diff);
+ me->GetMotionMaster()->Clear();
+ me->SetControlled(true, UNIT_STATE_ROOT);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ wailingSoulTick = 15;
+ events.DelayEvents(18s); // no other events during wailing souls
+ events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3s); // first one after 3 secs.
+ break;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_PHANTOM_BLAST:
- DoCastVictim(SPELL_PHANTOM_BLAST);
- events.ScheduleEvent(EVENT_PHANTOM_BLAST, 5s);
- break;
- case EVENT_MIRRORED_SOUL:
- DoCastAOE(SPELL_MIRRORED_SOUL_TARGET_SELECTOR);
- Talk(EMOTE_MIRRORED_SOUL);
- events.ScheduleEvent(EVENT_MIRRORED_SOUL, 15s, 30s);
- break;
- case EVENT_WELL_OF_SOULS:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_WELL_OF_SOULS);
- events.ScheduleEvent(EVENT_WELL_OF_SOULS, 20s);
- break;
- case EVENT_UNLEASHED_SOULS:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_UNLEASHED_SOULS);
- me->SetDisplayId(DISPLAY_SORROW);
- Talk(SAY_FACE_UNLEASH_SOUL);
- Talk(EMOTE_UNLEASH_SOUL);
- events.ScheduleEvent(EVENT_UNLEASHED_SOULS, 30s);
- events.ScheduleEvent(EVENT_FACE_ANGER, 5s);
- break;
- case EVENT_FACE_ANGER:
- me->SetDisplayId(DISPLAY_ANGER);
- break;
-
- case EVENT_WAILING_SOULS:
- me->SetDisplayId(DISPLAY_DESIRE);
- Talk(SAY_FACE_WAILING_SOUL);
- Talk(EMOTE_WAILING_SOUL);
- DoCast(me, SPELL_WAILING_SOULS_STARTING);
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- {
- me->SetFacingToObject(target);
- DoCast(me, SPELL_WAILING_SOULS_BEAM);
- }
-
- beamAngle = me->GetOrientation();
-
- beamAngleDiff = float(M_PI)/30.0f; // PI/2 in 15 sec = PI/30 per tick
- if (RAND(true, false))
- beamAngleDiff = -beamAngleDiff;
-
- me->InterruptNonMeleeSpells(false);
- me->SetReactState(REACT_PASSIVE);
-
- //Remove any target
- me->SetTarget(ObjectGuid::Empty);
-
- me->GetMotionMaster()->Clear();
- me->SetControlled(true, UNIT_STATE_ROOT);
-
- wailingSoulTick = 15;
- events.DelayEvents(18s); // no other events during wailing souls
- events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 3s); // first one after 3 secs.
- break;
-
- case EVENT_WAILING_SOULS_TICK:
- beamAngle += beamAngleDiff;
- me->SetFacingTo(beamAngle);
-
- DoCast(me, SPELL_WAILING_SOULS);
-
- if (--wailingSoulTick)
- events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1s);
- else
- {
- me->SetReactState(REACT_AGGRESSIVE);
- me->SetDisplayId(DISPLAY_ANGER);
- me->SetControlled(false, UNIT_STATE_ROOT);
- me->GetMotionMaster()->MoveChase(me->GetVictim());
- events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s);
- }
- break;
- }
+ case EVENT_WAILING_SOULS_TICK:
+ beamAngle += beamAngleDiff;
+ me->SetFacingTo(beamAngle);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
+ DoCast(me, SPELL_WAILING_SOULS);
- DoMeleeAttackIfReady();
+ if (--wailingSoulTick)
+ events.ScheduleEvent(EVENT_WAILING_SOULS_TICK, 1s);
+ else
+ {
+ me->SetReactState(REACT_AGGRESSIVE);
+ me->SetDisplayId(DISPLAY_ANGER);
+ me->SetControlled(false, UNIT_STATE_ROOT);
+ me->GetMotionMaster()->MoveChase(me->GetVictim());
+ events.ScheduleEvent(EVENT_WAILING_SOULS, 60s, 70s);
+ }
+ break;
}
- private:
- bool threeFaced;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
- // wailing soul event
- float beamAngle;
- float beamAngleDiff;
- int8 wailingSoulTick;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetForgeOfSoulsAI<boss_devourer_of_soulsAI>(creature);
- }
+private:
+ bool threeFaced;
+
+ // wailing soul event
+ float beamAngle;
+ float beamAngleDiff;
+ int8 wailingSoulTick;
};
// 69051 - Mirrored Soul
-class spell_devourer_of_souls_mirrored_soul : public SpellScriptLoader
+class spell_devourer_of_souls_mirrored_soul : public SpellScript
{
- public:
- spell_devourer_of_souls_mirrored_soul() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul") { }
-
- class spell_devourer_of_souls_mirrored_soul_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_PROC_AURA });
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- target->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_PROC_AURA, true);
- }
-
- void Register() override
- {
- OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_devourer_of_souls_mirrored_soul_SpellScript();
- }
+ PrepareSpellScript(spell_devourer_of_souls_mirrored_soul);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_PROC_AURA });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ target->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_PROC_AURA, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
// 69023 - Mirrored Soul (Proc)
-class spell_devourer_of_souls_mirrored_soul_proc : public SpellScriptLoader
+class spell_devourer_of_souls_mirrored_soul_proc : public AuraScript
{
- public:
- spell_devourer_of_souls_mirrored_soul_proc() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul_proc") { }
-
- class spell_devourer_of_souls_mirrored_soul_proc_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_devourer_of_souls_mirrored_soul_proc_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_DAMAGE });
- }
-
- bool CheckProc(ProcEventInfo& /*eventInfo*/)
- {
- return GetCaster() && GetCaster()->IsAlive();
- }
-
- void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
- {
- PreventDefaultAction();
- DamageInfo* damageInfo = eventInfo.GetDamageInfo();
- if (!damageInfo || !damageInfo->GetDamage())
- return;
-
- CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
- args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), 45));
- GetTarget()->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_DAMAGE, args);
- }
-
- void Register() override
- {
- DoCheckProc += AuraCheckProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::CheckProc);
- OnEffectProc += AuraEffectProcFn(spell_devourer_of_souls_mirrored_soul_proc_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_devourer_of_souls_mirrored_soul_proc_AuraScript();
- }
+ PrepareAuraScript(spell_devourer_of_souls_mirrored_soul_proc);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_DAMAGE });
+ }
+
+ bool CheckProc(ProcEventInfo& /*eventInfo*/)
+ {
+ return GetCaster() && GetCaster()->IsAlive();
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo)
+ {
+ PreventDefaultAction();
+ DamageInfo* damageInfo = eventInfo.GetDamageInfo();
+ if (!damageInfo || !damageInfo->GetDamage())
+ return;
+
+ CastSpellExtraArgs args(TRIGGERED_FULL_MASK);
+ args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), 45));
+ GetTarget()->CastSpell(GetCaster(), SPELL_MIRRORED_SOUL_DAMAGE, args);
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_devourer_of_souls_mirrored_soul_proc::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_devourer_of_souls_mirrored_soul_proc::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL);
+ }
};
// 69048 - Mirrored Soul (Target Selector)
-class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScriptLoader
+class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScript
{
- public:
- spell_devourer_of_souls_mirrored_soul_target_selector() : SpellScriptLoader("spell_devourer_of_souls_mirrored_soul_target_selector") { }
-
- class spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_BUFF });
- }
-
- void FilterTargets(std::list<WorldObject*>& targets)
- {
- if (targets.empty())
- return;
-
- WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
- targets.clear();
- targets.push_back(target);
- }
-
- void HandleScript(SpellEffIndex /*effIndex*/)
- {
- if (Unit* target = GetHitUnit())
- GetCaster()->CastSpell(target, SPELL_MIRRORED_SOUL_BUFF, false);
- }
-
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
- OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_devourer_of_souls_mirrored_soul_target_selector_SpellScript();
- }
+ PrepareSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MIRRORED_SOUL_BUFF });
+ }
+
+ void FilterTargets(std::list<WorldObject*>& targets)
+ {
+ if (targets.empty())
+ return;
+
+ WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
+ targets.clear();
+ targets.push_back(target);
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ if (Unit* target = GetHitUnit())
+ GetCaster()->CastSpell(target, SPELL_MIRRORED_SOUL_BUFF, false);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_devourer_of_souls_mirrored_soul_target_selector::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY);
+ OnEffectHitTarget += SpellEffectFn(spell_devourer_of_souls_mirrored_soul_target_selector::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
class achievement_three_faced : public AchievementCriteriaScript
@@ -492,9 +448,9 @@ class achievement_three_faced : public AchievementCriteriaScript
void AddSC_boss_devourer_of_souls()
{
- new boss_devourer_of_souls();
- new spell_devourer_of_souls_mirrored_soul();
- new spell_devourer_of_souls_mirrored_soul_proc();
- new spell_devourer_of_souls_mirrored_soul_target_selector();
+ RegisterForgeOfSoulsCreatureAI(boss_devourer_of_souls);
+ RegisterSpellScript(spell_devourer_of_souls_mirrored_soul);
+ RegisterSpellScript(spell_devourer_of_souls_mirrored_soul_proc);
+ RegisterSpellScript(spell_devourer_of_souls_mirrored_soul_target_selector);
new achievement_three_faced();
}
diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
index 9529a97744c..bbcebee96c4 100644
--- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
+++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp
@@ -76,210 +76,188 @@ enum ForgeSpells
SPELL_LETHARGY = 69133
};
-class npc_sylvanas_fos : public CreatureScript
+struct npc_sylvanas_fos : public ScriptedAI
{
-public:
- npc_sylvanas_fos() : CreatureScript("npc_sylvanas_fos") { }
+ npc_sylvanas_fos(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ instance = me->GetInstanceScript();
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
- struct npc_sylvanas_fosAI : public ScriptedAI
+ void Initialize()
{
- npc_sylvanas_fosAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = me->GetInstanceScript();
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
+ phase = PHASE_NORMAL;
+ }
- void Initialize()
- {
- phase = PHASE_NORMAL;
- }
+ InstanceScript* instance;
- InstanceScript* instance;
+ EventMap events;
+ Phase phase;
- EventMap events;
- Phase phase;
+ void Reset() override
+ {
+ events.Reset();
+ Initialize();
+ }
- void Reset() override
+ bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ {
+ if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID)
{
+ CloseGossipMenuFor(player);
+ phase = PHASE_INTRO;
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
- Initialize();
+ events.ScheduleEvent(EVENT_INTRO_1, 1s);
}
+ return false;
+ }
- bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ void UpdateAI(uint32 diff) override
+ {
+ if (phase == PHASE_INTRO)
{
- if (menuId == MENU_ID_SYLVANAS && gossipListId == GOSSIP_OPTION_ID)
+ events.Update(diff);
+ switch (events.ExecuteEvent())
{
- CloseGossipMenuFor(player);
- phase = PHASE_INTRO;
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- events.Reset();
- events.ScheduleEvent(EVENT_INTRO_1, 1s);
+ case EVENT_INTRO_1:
+ Talk(SAY_SYLVANAS_INTRO_1);
+ events.ScheduleEvent(EVENT_INTRO_2, 11500ms);
+ break;
+
+ case EVENT_INTRO_2:
+ Talk(SAY_SYLVANAS_INTRO_2);
+ events.ScheduleEvent(EVENT_INTRO_3, 10500ms);
+ break;
+
+ case EVENT_INTRO_3:
+ Talk(SAY_SYLVANAS_INTRO_3);
+ events.ScheduleEvent(EVENT_INTRO_4, 9500ms);
+ break;
+
+ case EVENT_INTRO_4:
+ Talk(SAY_SYLVANAS_INTRO_4);
+ events.ScheduleEvent(EVENT_INTRO_5, 10500ms);
+ break;
+
+ case EVENT_INTRO_5:
+ Talk(SAY_SYLVANAS_INTRO_5);
+ events.ScheduleEvent(EVENT_INTRO_6, 9500ms);
+ break;
+
+ case EVENT_INTRO_6:
+ Talk(SAY_SYLVANAS_INTRO_6);
+ // End of Intro
+ phase = PHASE_NORMAL;
+ break;
}
- return false;
}
- void UpdateAI(uint32 diff) override
- {
- if (phase == PHASE_INTRO)
- {
- events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_INTRO_1:
- Talk(SAY_SYLVANAS_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_2, 11500ms);
- break;
-
- case EVENT_INTRO_2:
- Talk(SAY_SYLVANAS_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_3, 10500ms);
- break;
-
- case EVENT_INTRO_3:
- Talk(SAY_SYLVANAS_INTRO_3);
- events.ScheduleEvent(EVENT_INTRO_4, 9500ms);
- break;
-
- case EVENT_INTRO_4:
- Talk(SAY_SYLVANAS_INTRO_4);
- events.ScheduleEvent(EVENT_INTRO_5, 10500ms);
- break;
-
- case EVENT_INTRO_5:
- Talk(SAY_SYLVANAS_INTRO_5);
- events.ScheduleEvent(EVENT_INTRO_6, 9500ms);
- break;
-
- case EVENT_INTRO_6:
- Talk(SAY_SYLVANAS_INTRO_6);
- // End of Intro
- phase = PHASE_NORMAL;
- break;
- }
- }
-
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetForgeOfSoulsAI<npc_sylvanas_fosAI>(creature);
+ events.Update(diff);
+ DoMeleeAttackIfReady();
}
};
-class npc_jaina_fos : public CreatureScript
+struct npc_jaina_fos: public ScriptedAI
{
-public:
- npc_jaina_fos() : CreatureScript("npc_jaina_fos") { }
+ npc_jaina_fos(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ instance = me->GetInstanceScript();
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
+ }
- struct npc_jaina_fosAI: public ScriptedAI
+ void Initialize()
{
- npc_jaina_fosAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = me->GetInstanceScript();
- me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- }
+ phase = PHASE_NORMAL;
+ }
- void Initialize()
- {
- phase = PHASE_NORMAL;
- }
+ InstanceScript* instance;
- InstanceScript* instance;
+ EventMap events;
+ Phase phase;
- EventMap events;
- Phase phase;
+ void Reset() override
+ {
+ events.Reset();
+ Initialize();
+ }
- void Reset() override
+ bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ {
+ if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID)
{
+ CloseGossipMenuFor(player);
+ phase = PHASE_INTRO;
+ me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
events.Reset();
- Initialize();
+ events.ScheduleEvent(EVENT_INTRO_1, 1s);
}
+ return false;
+ }
- bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override
+ void UpdateAI(uint32 diff) override
+ {
+ if (phase == PHASE_INTRO)
{
- if (menuId == MENU_ID_JAINA && gossipListId == GOSSIP_OPTION_ID)
+ events.Update(diff);
+ switch (events.ExecuteEvent())
{
- CloseGossipMenuFor(player);
- phase = PHASE_INTRO;
- me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
- events.Reset();
- events.ScheduleEvent(EVENT_INTRO_1, 1s);
+ case EVENT_INTRO_1:
+ Talk(SAY_JAINA_INTRO_1);
+ events.ScheduleEvent(EVENT_INTRO_2, 8s);
+ break;
+
+ case EVENT_INTRO_2:
+ Talk(SAY_JAINA_INTRO_2);
+ events.ScheduleEvent(EVENT_INTRO_3, 8500ms);
+ break;
+
+ case EVENT_INTRO_3:
+ Talk(SAY_JAINA_INTRO_3);
+ events.ScheduleEvent(EVENT_INTRO_4, 8s);
+ break;
+
+ case EVENT_INTRO_4:
+ Talk(SAY_JAINA_INTRO_4);
+ events.ScheduleEvent(EVENT_INTRO_5, 10s);
+ break;
+
+ case EVENT_INTRO_5:
+ Talk(SAY_JAINA_INTRO_5);
+ events.ScheduleEvent(EVENT_INTRO_6, 8s);
+ break;
+
+ case EVENT_INTRO_6:
+ Talk(SAY_JAINA_INTRO_6);
+ events.ScheduleEvent(EVENT_INTRO_7, 12s);
+ break;
+
+ case EVENT_INTRO_7:
+ Talk(SAY_JAINA_INTRO_7);
+ events.ScheduleEvent(EVENT_INTRO_8, 8s);
+ break;
+
+ case EVENT_INTRO_8:
+ Talk(SAY_JAINA_INTRO_8);
+ // End of Intro
+ phase = PHASE_NORMAL;
+ break;
}
- return false;
}
- void UpdateAI(uint32 diff) override
- {
- if (phase == PHASE_INTRO)
- {
- events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_INTRO_1:
- Talk(SAY_JAINA_INTRO_1);
- events.ScheduleEvent(EVENT_INTRO_2, 8s);
- break;
-
- case EVENT_INTRO_2:
- Talk(SAY_JAINA_INTRO_2);
- events.ScheduleEvent(EVENT_INTRO_3, 8500ms);
- break;
-
- case EVENT_INTRO_3:
- Talk(SAY_JAINA_INTRO_3);
- events.ScheduleEvent(EVENT_INTRO_4, 8s);
- break;
-
- case EVENT_INTRO_4:
- Talk(SAY_JAINA_INTRO_4);
- events.ScheduleEvent(EVENT_INTRO_5, 10s);
- break;
-
- case EVENT_INTRO_5:
- Talk(SAY_JAINA_INTRO_5);
- events.ScheduleEvent(EVENT_INTRO_6, 8s);
- break;
-
- case EVENT_INTRO_6:
- Talk(SAY_JAINA_INTRO_6);
- events.ScheduleEvent(EVENT_INTRO_7, 12s);
- break;
-
- case EVENT_INTRO_7:
- Talk(SAY_JAINA_INTRO_7);
- events.ScheduleEvent(EVENT_INTRO_8, 8s);
- break;
-
- case EVENT_INTRO_8:
- Talk(SAY_JAINA_INTRO_8);
- // End of Intro
- phase = PHASE_NORMAL;
- break;
- }
- }
-
- //Return since we have no target
- if (!UpdateVictim())
- return;
+ //Return since we have no target
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- DoMeleeAttackIfReady();
- }
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetForgeOfSoulsAI<npc_jaina_fosAI>(creature);
+ DoMeleeAttackIfReady();
}
};
@@ -310,7 +288,7 @@ class spell_forge_of_souls_soul_sickness : public AuraScript
void AddSC_forge_of_souls()
{
- new npc_sylvanas_fos();
- new npc_jaina_fos();
+ RegisterForgeOfSoulsCreatureAI(npc_sylvanas_fos);
+ RegisterForgeOfSoulsCreatureAI(npc_jaina_fos);
RegisterSpellScript(spell_forge_of_souls_soul_sickness);
}