fix(Scripts/Naxxramas): Update Faerlina script (#21375)
This commit is contained in:
parent
edcfaeb845
commit
f9415f38cb
@ -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
|
||||
{
|
||||
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;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user