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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 123 deletions

View File

@ -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);

View File

@ -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;
};
};