aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-04-13 10:18:00 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-08 16:13:04 +0100
commitf2d7e11908e2d3f89f3a10e4c658c37d7772eef3 (patch)
tree5170218e729f246e3e1ef288782145778594d2ad /src
parentd7fe2868ab945374344de88047e45d8c03f1fb61 (diff)
Scripts/Naxxramas: Update Faerlina to new model (#26378)
Co-authored-by: offl <offl@users.noreply.github.com> (cherry picked from commit 4d82c6a1865d726bae2a77b8a1579247c7c317e2)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp318
1 files changed, 148 insertions, 170 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
index e0ce4254498..aeb36c4fa10 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
@@ -65,192 +65,170 @@ enum Misc
DATA_FRENZY_DISPELS = 1
};
-class boss_faerlina : public CreatureScript
+struct boss_faerlina : public BossAI
{
- public:
- boss_faerlina() : CreatureScript("boss_faerlina") { }
-
- struct boss_faerlinaAI : public BossAI
+ boss_faerlina(Creature* creature) : BossAI(creature, BOSS_FAERLINA), _frenzyDispels(0) { }
+
+ void SummonAdds()
+ {
+ me->SummonCreatureGroup(SUMMON_GROUP_WORSHIPPERS);
+ if (Is25ManRaid())
+ me->SummonCreatureGroup(SUMMON_GROUP_FOLLOWERS);
+ }
+
+ void InitializeAI() override
+ {
+ if (!me->isDead() && instance->GetBossState(BOSS_FAERLINA) != DONE)
{
- boss_faerlinaAI(Creature* creature) : BossAI(creature, BOSS_FAERLINA), _frenzyDispels(0) { }
-
- void SummonAdds()
- {
- me->SummonCreatureGroup(SUMMON_GROUP_WORSHIPPERS);
- if (Is25ManRaid())
- me->SummonCreatureGroup(SUMMON_GROUP_FOLLOWERS);
- }
-
- void InitializeAI() override
- {
- if (!me->isDead() && instance->GetBossState(BOSS_FAERLINA) != DONE)
- {
- Reset();
- SummonAdds();
- }
- }
-
- void JustReachedHome() override
- {
- _JustReachedHome();
- SummonAdds();
- }
-
- void JustEngagedWith(Unit* who) override
- {
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- summons.DoZoneInCombat();
- events.ScheduleEvent(EVENT_POISON, randtime(Seconds(10), Seconds(15)));
- events.ScheduleEvent(EVENT_FIRE, randtime(Seconds(6), Seconds(18)));
- events.ScheduleEvent(EVENT_FRENZY, Minutes(1)+randtime(0s, Seconds(20)));
- }
-
- void Reset() override
- {
- _Reset();
- _frenzyDispels = 0;
- }
+ Reset();
+ SummonAdds();
+ }
+ }
+
+ void JustReachedHome() override
+ {
+ _JustReachedHome();
+ SummonAdds();
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ summons.DoZoneInCombat();
+ events.ScheduleEvent(EVENT_POISON, randtime(Seconds(10), Seconds(15)));
+ events.ScheduleEvent(EVENT_FIRE, randtime(Seconds(6), Seconds(18)));
+ events.ScheduleEvent(EVENT_FRENZY, Minutes(1)+randtime(0s, Seconds(20)));
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ _frenzyDispels = 0;
+ }
+
+ void KilledUnit(Unit* victim) override
+ {
+ if (victim->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
+ {
+ Unit* unitCaster = caster->ToUnit();
+ if (!unitCaster)
+ return;
+
+ if (spellInfo->Id == SPELL_WIDOWS_EMBRACE_HELPER)
+ {
+ ++_frenzyDispels;
+ Talk(EMOTE_WIDOW_EMBRACE, caster);
+ Unit::Kill(me, unitCaster);
+ }
+ }
- void KilledUnit(Unit* victim) override
- {
- if (victim->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
+ uint32 GetData(uint32 type) const override
+ {
+ if (type == DATA_FRENZY_DISPELS)
+ return _frenzyDispels;
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
+ return 0;
+ }
- void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override
- {
- Unit* unitCaster = caster->ToUnit();
- if (!unitCaster)
- return;
-
- if (spellInfo->Id == SPELL_WIDOWS_EMBRACE_HELPER)
- {
- ++_frenzyDispels;
- Talk(EMOTE_WIDOW_EMBRACE, caster);
- Unit::Kill(me, unitCaster);
- }
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- uint32 GetData(uint32 type) const override
- {
- if (type == DATA_FRENZY_DISPELS)
- return _frenzyDispels;
+ events.Update(diff);
- return 0;
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void UpdateAI(uint32 diff) override
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ case EVENT_POISON:
+ if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
+ DoCastAOE(SPELL_POISON_BOLT_VOLLEY);
+ events.Repeat(randtime(Seconds(8), Seconds(15)));
+ break;
+ case EVENT_FIRE:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_RAIN_OF_FIRE);
+ events.Repeat(randtime(Seconds(6), Seconds(18)));
+ break;
+ case EVENT_FRENZY:
+ if (Aura* widowsEmbrace = me->GetAura(SPELL_WIDOWS_EMBRACE_HELPER))
+ events.ScheduleEvent(EVENT_FRENZY, Milliseconds(widowsEmbrace->GetDuration()+1));
+ else
{
- case EVENT_POISON:
- if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
- DoCastAOE(SPELL_POISON_BOLT_VOLLEY);
- events.Repeat(randtime(Seconds(8), Seconds(15)));
- break;
- case EVENT_FIRE:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_RAIN_OF_FIRE);
- events.Repeat(randtime(Seconds(6), Seconds(18)));
- break;
- case EVENT_FRENZY:
- if (Aura* widowsEmbrace = me->GetAura(SPELL_WIDOWS_EMBRACE_HELPER))
- events.ScheduleEvent(EVENT_FRENZY, Milliseconds(widowsEmbrace->GetDuration()+1));
- else
- {
- DoCast(SPELL_FRENZY);
- Talk(EMOTE_FRENZY);
- events.Repeat(Minutes(1) + randtime(0s, Seconds(20)));
- }
- break;
+ DoCast(SPELL_FRENZY);
+ Talk(EMOTE_FRENZY);
+ events.Repeat(Minutes(1) + randtime(0s, Seconds(20)));
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ break;
}
- private:
- uint32 _frenzyDispels;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetNaxxramasAI<boss_faerlinaAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
-};
-class npc_faerlina_add : public CreatureScript
-{
- public:
- npc_faerlina_add() : CreatureScript("npc_faerlina_add") { }
+ DoMeleeAttackIfReady();
+ }
- struct npc_faerlina_addAI : public ScriptedAI
- {
- npc_faerlina_addAI(Creature* creature) : ScriptedAI(creature),
- _instance(creature->GetInstanceScript())
- {
- }
-
- void Reset() override
- {
- if (!Is25ManRaid()) {
- me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_BIND, true);
- me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
- }
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FAERLINA)))
- faerlina->AI()->DoZoneInCombat();
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- if (!Is25ManRaid())
- if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FAERLINA)))
- DoCast(faerlina, SPELL_WIDOWS_EMBRACE);
- }
-
- void UpdateAI(uint32 /*diff*/) override
- {
- if (!UpdateVictim())
- return;
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- DoCastVictim(SPELL_ADD_FIREBALL);
- DoMeleeAttackIfReady(); // this will only happen if the fireball cast fails for some reason
- }
-
- private:
- InstanceScript* const _instance;
- };
+private:
+ uint32 _frenzyDispels;
+};
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetNaxxramasAI<npc_faerlina_addAI>(creature);
+struct npc_faerlina_add : public ScriptedAI
+{
+ npc_faerlina_add(Creature* creature) : ScriptedAI(creature),
+ _instance(creature->GetInstanceScript())
+ {
+ }
+
+ void Reset() override
+ {
+ if (!Is25ManRaid()) {
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_BIND, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
}
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FAERLINA)))
+ faerlina->AI()->DoZoneInCombat();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (!Is25ManRaid())
+ if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_FAERLINA)))
+ DoCast(faerlina, SPELL_WIDOWS_EMBRACE);
+ }
+
+ void UpdateAI(uint32 /*diff*/) override
+ {
+ if (!UpdateVictim())
+ return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ DoCastVictim(SPELL_ADD_FIREBALL);
+ DoMeleeAttackIfReady(); // this will only happen if the fireball cast fails for some reason
+ }
+
+private:
+ InstanceScript* const _instance;
};
class achievement_momma_said_knock_you_out : public AchievementCriteriaScript
@@ -284,8 +262,8 @@ class at_faerlina_entrance : public OnlyOnceAreaTriggerScript
void AddSC_boss_faerlina()
{
- new boss_faerlina();
- new npc_faerlina_add();
+ RegisterNaxxramasCreatureAI(boss_faerlina);
+ RegisterNaxxramasCreatureAI(npc_faerlina_add);
new at_faerlina_entrance();
new achievement_momma_said_knock_you_out();
}