fix(Scripts/Naxxramas): Update Faerlina script (#21375)

This commit is contained in:
Andrew
2025-02-13 05:04:36 -03:00
committed by GitHub
parent edcfaeb845
commit f9415f38cb
2 changed files with 49 additions and 123 deletions
@@ -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);
@@ -33,21 +33,16 @@ enum Yells
enum Spells enum Spells
{ {
SPELL_POISON_BOLT_VOLLEY_10 = 28796, SPELL_POISON_BOLT_VOLLEY = 28796,
SPELL_POISON_BOLT_VOLLEY_25 = 54098, SPELL_RAIN_OF_FIRE = 28794,
SPELL_RAIN_OF_FIRE_10 = 28794, SPELL_FRENZY = 28798,
SPELL_RAIN_OF_FIRE_25 = 54099,
SPELL_FRENZY_10 = 28798,
SPELL_FRENZY_25 = 54100,
SPELL_WIDOWS_EMBRACE = 28732, SPELL_WIDOWS_EMBRACE = 28732,
SPELL_MINION_WIDOWS_EMBRACE = 54097 SPELL_MINION_WIDOWS_EMBRACE = 54097
}; };
enum Events enum Groups
{ {
EVENT_POISON_BOLT = 1, GROUP_FRENZY = 1
EVENT_RAIN_OF_FIRE = 2,
EVENT_FRENZY = 3
}; };
enum Misc enum Misc
@@ -68,16 +63,7 @@ public:
struct boss_faerlinaAI : public BossAI struct boss_faerlinaAI : public BossAI
{ {
boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), summons(me) boss_faerlinaAI(Creature* c) : BossAI(c, BOSS_FAERLINA), _introDone(false) { }
{
pInstance = me->GetInstanceScript();
sayGreet = false;
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
bool sayGreet;
void SummonHelpers() void SummonHelpers()
{ {
@@ -92,25 +78,14 @@ public:
} }
} }
void JustSummoned(Creature* cr) override
{
summons.Summon(cr);
}
void Reset() override void Reset() override
{ {
BossAI::Reset(); BossAI::Reset();
events.Reset();
summons.DespawnAll(); summons.DespawnAll();
SummonHelpers(); SummonHelpers();
if (pInstance) if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
{
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
{
go->SetGoState(GO_STATE_ACTIVE); go->SetGoState(GO_STATE_ACTIVE);
} }
}
}
void JustEngagedWith(Unit* who) override void JustEngagedWith(Unit* who) override
{ {
@@ -118,25 +93,38 @@ public:
me->CallForHelp(VISIBLE_RANGE); me->CallForHelp(VISIBLE_RANGE);
summons.DoZoneInCombat(); summons.DoZoneInCombat();
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_POISON_BOLT, 7s, 15s);
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 8s, 18s); ScheduleTimedEvent(7s, 15s, [&]{
events.ScheduleEvent(EVENT_FRENZY, 60s, 80s, 1); if (!me->HasAura(SPELL_WIDOWS_EMBRACE))
events.SetPhase(1); DoCastVictim(SPELL_POISON_BOLT_VOLLEY);
if (pInstance) }, 7s, 15s);
{
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB))) 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))
{ {
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); go->SetGoState(GO_STATE_READY);
} }
}
}
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
{ {
if (!sayGreet && who->IsPlayer()) if (!_introDone && who->IsPlayer())
{ {
Talk(SAY_GREET); Talk(SAY_GREET);
sayGreet = true; _introDone = true;
} }
ScriptedAI::MoveInLineOfSight(who); ScriptedAI::MoveInLineOfSight(who);
} }
@@ -147,102 +135,34 @@ public:
return; return;
if (!urand(0, 3)) if (!urand(0, 3))
{
Talk(SAY_SLAY); Talk(SAY_SLAY);
}
if (pInstance) instance->SetData(DATA_IMMORTAL_FAIL, 0);
{
pInstance->SetData(DATA_IMMORTAL_FAIL, 0);
}
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
if (pInstance) if (GameObject* go = me->GetMap()->GetGameObject(instance->GetGuidData(DATA_FAERLINA_WEB)))
{
if (GameObject* go = me->GetMap()->GetGameObject(pInstance->GetGuidData(DATA_FAERLINA_WEB)))
{
go->SetGoState(GO_STATE_ACTIVE); 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();
}
void SpellHit(Unit* caster, SpellInfo const* spell) override void SpellHit(Unit* caster, SpellInfo const* spell) override
{ {
if (spell->Id == RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE)) if (spell->Id == RAID_MODE(SPELL_WIDOWS_EMBRACE, SPELL_MINION_WIDOWS_EMBRACE))
{ {
Talk(EMOTE_WIDOWS_EMBRACE); Talk(EMOTE_WIDOWS_EMBRACE);
if (me->HasAura(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25))) scheduler.RescheduleGroup(GROUP_FRENZY, 1min);
{ me->RemoveAurasDueToSpell(SPELL_FRENZY);
me->RemoveAurasDueToSpell(RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25)); instance->SetData(DATA_FRENZY_REMOVED, 0);
events.RescheduleEvent(EVENT_FRENZY, 1min);
}
pInstance->SetData(DATA_FRENZY_REMOVED, 0);
if (Is25ManRaid()) if (Is25ManRaid())
{ caster->KillSelf();
Unit::Kill(caster, caster);
}
} }
} }
private:
bool _introDone;
}; };
}; };