From f9415f38cbd54a7820f43e6b327447ba55bcca5e Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 13 Feb 2025 05:04:36 -0300 Subject: [PATCH] fix(Scripts/Naxxramas): Update Faerlina script (#21375) --- .../rev_1739149791709679700.sql | 6 + .../Northrend/Naxxramas/boss_faerlina.cpp | 166 +++++------------- 2 files changed, 49 insertions(+), 123 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1739149791709679700.sql diff --git a/data/sql/updates/pending_db_world/rev_1739149791709679700.sql b/data/sql/updates/pending_db_world/rev_1739149791709679700.sql new file mode 100644 index 000000000..986d91122 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1739149791709679700.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `spelldifficulty_dbc` WHERE `ID` IN (28796, 28794, 28798); +INSERT INTO `spelldifficulty_dbc` (`ID`, `DifficultySpellID_1`, `DifficultySpellID_2`, `DifficultySpellID_3`, `DifficultySpellID_4`) VALUES +(28796, 28796, 54098, 0, 0), +(28794, 28794, 54099, 0, 0), +(28798, 28798, 54100, 0, 0); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp index ad9c534a6..1be14803f 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp @@ -33,21 +33,16 @@ enum Yells enum Spells { - SPELL_POISON_BOLT_VOLLEY_10 = 28796, - SPELL_POISON_BOLT_VOLLEY_25 = 54098, - SPELL_RAIN_OF_FIRE_10 = 28794, - SPELL_RAIN_OF_FIRE_25 = 54099, - SPELL_FRENZY_10 = 28798, - SPELL_FRENZY_25 = 54100, + SPELL_POISON_BOLT_VOLLEY = 28796, + SPELL_RAIN_OF_FIRE = 28794, + SPELL_FRENZY = 28798, SPELL_WIDOWS_EMBRACE = 28732, SPELL_MINION_WIDOWS_EMBRACE = 54097 }; -enum Events +enum Groups { - EVENT_POISON_BOLT = 1, - EVENT_RAIN_OF_FIRE = 2, - EVENT_FRENZY = 3 + GROUP_FRENZY = 1 }; enum Misc @@ -68,16 +63,7 @@ public: struct boss_faerlinaAI : public BossAI { - boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), summons(me) - { - pInstance = me->GetInstanceScript(); - sayGreet = false; - } - - InstanceScript* pInstance; - EventMap events; - SummonList summons; - bool sayGreet; + boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), _introDone(false) { } void SummonHelpers() { @@ -92,24 +78,13 @@ public: } } - void JustSummoned(Creature* cr) override - { - summons.Summon(cr); - } - void Reset() override { BossAI::Reset(); - events.Reset(); summons.DespawnAll(); SummonHelpers(); - if (pInstance) - { - if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB))) - { - go->SetGoState(GO_STATE_ACTIVE); - } - } + if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB))) + go->SetGoState(GO_STATE_ACTIVE); } void JustEngagedWith(Unit* who) override @@ -118,25 +93,38 @@ public: me->CallForHelp(VISIBLE_RANGE); summons.DoZoneInCombat(); Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_POISON_BOLT, 7s, 15s); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 8s, 18s); - events.ScheduleEvent(EVENT_FRENZY, 60s, 80s, 1); - events.SetPhase(1); - if (pInstance) - { - if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB))) + + ScheduleTimedEvent(7s, 15s, [&]{ + if (!me->HasAura(SPELL_WIDOWS_EMBRACE)) + DoCastVictim(SPELL_POISON_BOLT_VOLLEY); + }, 7s, 15s); + + ScheduleTimedEvent(8s, 18s, [&] { + DoCastRandomTarget(SPELL_RAIN_OF_FIRE); + }, 8s, 18s); + + scheduler.Schedule(60s, 80s, GROUP_FRENZY, [this](TaskContext context) { + if (!me->HasAura(SPELL_WIDOWS_EMBRACE)) { - go->SetGoState(GO_STATE_READY); + Talk(SAY_FRENZY); + Talk(EMOTE_FRENZY); + DoCastSelf(SPELL_FRENZY, true); + context.Repeat(1min); } - } + else + context.Repeat(30s); + }); + + if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB))) + go->SetGoState(GO_STATE_READY); } void MoveInLineOfSight(Unit* who) override { - if (!sayGreet && who->IsPlayer()) + if (!_introDone && who->IsPlayer()) { Talk(SAY_GREET); - sayGreet = true; + _introDone = true; } ScriptedAI::MoveInLineOfSight(who); } @@ -147,83 +135,17 @@ public: return; if (!urand(0, 3)) - { Talk(SAY_SLAY); - } - if (pInstance) - { - pInstance->SetData(DATA_IMMORTAL_FAIL, 0); - } + + instance->SetData(DATA_IMMORTAL_FAIL, 0); } void JustDied(Unit* killer) override { BossAI::JustDied(killer); Talk(SAY_DEATH); - if (pInstance) - { - if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB))) - { - go->SetGoState(GO_STATE_ACTIVE); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!me->IsInCombat() && sayGreet) - { - for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (pInstance) - { - if (Creature* cr = pInstance->instance->GetCreature(*itr)) - { - if (cr->IsInCombat()) - DoZoneInCombat(); - } - } - } - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_POISON_BOLT: - if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE))) - { - me->CastCustomSpell(RAID_MODE(SPELL_POISON_BOLT_VOLLEY_10, SPELL_POISON_BOLT_VOLLEY_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); - } - events.Repeat(7s, 15s); - break; - case EVENT_RAIN_OF_FIRE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - me->CastSpell(target, RAID_MODE(SPELL_RAIN_OF_FIRE_10, SPELL_RAIN_OF_FIRE_25), false); - } - events.Repeat(8s, 18s); - break; - case EVENT_FRENZY: - if (!me->HasAura(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25))) - { - Talk(SAY_FRENZY); - Talk(EMOTE_FRENZY); - me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25), true); - events.Repeat(1min); - } - else - { - events.Repeat(30s); - } - break; - } - DoMeleeAttackIfReady(); + if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB))) + go->SetGoState(GO_STATE_ACTIVE); } void SpellHit(Unit* caster, SpellInfo const* spell) override @@ -231,18 +153,16 @@ public: if (spell->Id == RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE)) { Talk(EMOTE_WIDOWS_EMBRACE); - if (me->HasAura(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25))) - { - me->RemoveAurasDueToSpell(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25)); - events.RescheduleEvent(EVENT_FRENZY, 1min); - } - pInstance->SetData(DATA_FRENZY_REMOVED, 0); + scheduler.RescheduleGroup(GROUP_FRENZY, 1min); + me->RemoveAurasDueToSpell(SPELL_FRENZY); + instance->SetData(DATA_FRENZY_REMOVED, 0); if (Is25ManRaid()) - { - Unit::Kill(caster, caster); - } + caster->KillSelf(); } } + + private: + bool _introDone; }; };