refactor(Scripts/Karazhan): Use std::chrono for Maiden, Servant Quart… (#14864)

This commit is contained in:
Skjalf
2023-02-04 15:46:59 -03:00
committed by GitHub
parent 8aa331b432
commit 1ee93986f6
3 changed files with 247 additions and 276 deletions
@@ -49,10 +49,10 @@ struct boss_maiden_of_virtue : public BossAI
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
DoCastAOE(SPELL_HOLY_GROUND, true); DoCastAOE(SPELL_HOLY_GROUND, true);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000); events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25s);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000); events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8s);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15s);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); events.ScheduleEvent(EVENT_SPELL_ENRAGE, 10min);
} }
void KilledUnit(Unit* /*victim*/) override void KilledUnit(Unit* /*victim*/) override
@@ -60,7 +60,7 @@ struct boss_maiden_of_virtue : public BossAI
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_SLAY); Talk(SAY_SLAY);
events.ScheduleEvent(EVENT_KILL_TALK, 5000); events.ScheduleEvent(EVENT_KILL_TALK, 5s);
} }
} }
@@ -84,15 +84,15 @@ struct boss_maiden_of_virtue : public BossAI
case EVENT_SPELL_REPENTANCE: case EVENT_SPELL_REPENTANCE:
DoCastAOE(SPELL_REPENTANCE, true); DoCastAOE(SPELL_REPENTANCE, true);
Talk(SAY_REPENTANCE); Talk(SAY_REPENTANCE);
events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000)); events.Repeat(25s, 35s);
break; break;
case EVENT_SPELL_HOLY_FIRE: case EVENT_SPELL_HOLY_FIRE:
DoCastRandomTarget(SPELL_HOLY_FIRE, 0, 50.0f); DoCastRandomTarget(SPELL_HOLY_FIRE, 0, 50.0f);
events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000)); events.Repeat(8s, 18s);
break; break;
case EVENT_SPELL_HOLY_WRATH: case EVENT_SPELL_HOLY_WRATH:
DoCastRandomTarget(SPELL_HOLY_WRATH, 0, 80.0f); DoCastRandomTarget(SPELL_HOLY_WRATH, 0, 80.0f);
events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000)); events.Repeat(20s, 25s);
break; break;
case EVENT_SPELL_ENRAGE: case EVENT_SPELL_ENRAGE:
DoCastSelf(SPELL_BERSERK, true); DoCastSelf(SPELL_BERSERK, true);
@@ -78,21 +78,13 @@ const uint32 GuestEntries[6] =
19876, 19876,
}; };
class boss_moroes : public CreatureScript struct boss_moroes : public BossAI
{ {
public: boss_moroes(Creature* creature) : BossAI(creature, DATA_MOROES)
boss_moroes() : CreatureScript("boss_moroes") { }
struct boss_moroesAI : public BossAI
{
boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES)
{ {
_activeGuests = 0; _activeGuests = 0;
instance = creature->GetInstanceScript();
} }
InstanceScript* instance;
void InitializeAI() override void InitializeAI() override
{ {
BossAI::InitializeAI(); BossAI::InitializeAI();
@@ -123,13 +115,13 @@ public:
me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN); me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN);
_events2.Reset(); _events2.Reset();
_events2.ScheduleEvent(EVENT_GUEST_TALK, 10000); _events2.ScheduleEvent(EVENT_GUEST_TALK, 10s);
} }
void Reset() override void Reset() override
{ {
BossAI::Reset(); BossAI::Reset();
me->CastSpell(me, SPELL_DUAL_WIELD, true); DoCastSelf(SPELL_DUAL_WIELD, true);
} }
void EnterCombat(Unit* who) override void EnterCombat(Unit* who) override
@@ -137,11 +129,11 @@ public:
BossAI::EnterCombat(who); BossAI::EnterCombat(who);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); events.ScheduleEvent(EVENT_SPELL_VANISH, 30s);
events.ScheduleEvent(EVENT_SPELL_BLIND, 20000); events.ScheduleEvent(EVENT_SPELL_BLIND, 20s);
events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000); events.ScheduleEvent(EVENT_SPELL_GOUGE, 13s);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000); events.ScheduleEvent(EVENT_CHECK_HEALTH, 5s);
events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); events.ScheduleEvent(EVENT_SPELL_ENRAGE, 10min);
_events2.Reset(); _events2.Reset();
me->CallForHelp(20.0f); me->CallForHelp(20.0f);
@@ -153,24 +145,17 @@ public:
if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) if (events.GetNextEventTime(EVENT_KILL_TALK) == 0)
{ {
Talk(SAY_KILL); Talk(SAY_KILL);
events.ScheduleEvent(EVENT_KILL_TALK, 5000); events.ScheduleEvent(EVENT_KILL_TALK, 5s);
} }
} }
void JustDied(Unit* killer) override void JustDied(Unit* killer) override
{ {
summons.clear();
BossAI::JustDied(killer); BossAI::JustDied(killer);
Talk(SAY_DEATH); Talk(SAY_DEATH);
instance->SetBossState(DATA_MOROES, DONE);
instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE);
} }
void JustSummoned(Creature* summon) override
{
summons.Summon(summon);
}
Creature* GetRandomGuest() Creature* GetRandomGuest()
{ {
std::list<Creature*> guestList; std::list<Creature*> guestList;
@@ -189,11 +174,11 @@ public:
case EVENT_GUEST_TALK: case EVENT_GUEST_TALK:
if (Creature* guest = GetRandomGuest()) if (Creature* guest = GetRandomGuest())
guest->AI()->Talk(SAY_GUEST); guest->AI()->Talk(SAY_GUEST);
_events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000); _events2.Repeat(5s);
break; break;
case EVENT_GUEST_TALK2: case EVENT_GUEST_TALK2:
Talk(SAY_OUT_OF_COMBAT); Talk(SAY_OUT_OF_COMBAT);
_events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000)); _events2.Repeat(1min, 2min);
break; break;
} }
@@ -209,35 +194,36 @@ public:
case EVENT_CHECK_HEALTH: case EVENT_CHECK_HEALTH:
if (me->HealthBelowPct(31)) if (me->HealthBelowPct(31))
{ {
me->CastSpell(me, SPELL_FRENZY, true); DoCastSelf(SPELL_FRENZY, true);
break; break;
} }
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); events.Repeat(1s);
break; break;
case EVENT_SPELL_ENRAGE: case EVENT_SPELL_ENRAGE:
me->CastSpell(me, SPELL_BERSERK, true); DoCastSelf(SPELL_BERSERK, true);
break; break;
case EVENT_SPELL_BLIND: case EVENT_SPELL_BLIND:
if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 10.0f, true)) if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 10.0f, true))
me->CastSpell(target, SPELL_BLIND, false); {
events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000)); DoCast(target, SPELL_BLIND);
}
events.Repeat(25s, 40s);
break; break;
case EVENT_SPELL_GOUGE: case EVENT_SPELL_GOUGE:
me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); DoCastVictim(SPELL_GOUGE);
events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000)); events.Repeat(25s, 40s);
return; return;
case EVENT_SPELL_VANISH: case EVENT_SPELL_VANISH:
events.DelayEvents(9000); events.DelayEvents(9s);
events.SetPhase(1); events.SetPhase(1);
me->CastSpell(me, SPELL_VANISH, false); DoCastSelf(SPELL_VANISH);
events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); events.Repeat(30s);
events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); events.ScheduleEvent(EVENT_SPELL_GARROTE, 5s, 7s);
return; return;
case EVENT_SPELL_GARROTE: case EVENT_SPELL_GARROTE:
Talk(SAY_SPECIAL); Talk(SAY_SPECIAL);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) DoCastRandomTarget(SPELL_GARROTE, 0, 100.0f, true, true);
target->CastSpell(target, SPELL_GARROTE, true); DoCastSelf(SPELL_VANISH_TELEPORT);
me->CastSpell(me, SPELL_VANISH_TELEPORT, false);
events.SetPhase(0); events.SetPhase(0);
break; break;
} }
@@ -252,12 +238,6 @@ public:
uint8 _activeGuests; uint8 _activeGuests;
}; };
CreatureAI* GetAI(Creature* creature) const override
{
return GetKarazhanAI<boss_moroesAI>(creature);
}
};
class spell_moroes_vanish : public SpellScriptLoader class spell_moroes_vanish : public SpellScriptLoader
{ {
public: public:
@@ -293,6 +273,6 @@ public:
void AddSC_boss_moroes() void AddSC_boss_moroes()
{ {
new boss_moroes(); RegisterKarazhanCreatureAI(boss_moroes);
new spell_moroes_vanish(); new spell_moroes_vanish();
} }
@@ -48,14 +48,9 @@ enum ServantQuertersMisc
EVENT_CHECK_VISIBILITY = 30 EVENT_CHECK_VISIBILITY = 30
}; };
class boss_servant_quarters : public CreatureScript struct boss_servant_quarters : public BossAI
{ {
public: boss_servant_quarters(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { }
boss_servant_quarters() : CreatureScript("boss_servant_quarters") { }
struct boss_servant_quartersAI : public BossAI
{
boss_servant_quartersAI(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { }
void Reset() override void Reset() override
{ {
@@ -64,9 +59,12 @@ public:
me->SetReactState(REACT_PASSIVE); me->SetReactState(REACT_PASSIVE);
me->SetFaction(FACTION_FRIENDLY); me->SetFaction(FACTION_FRIENDLY);
_events2.Reset(); _events2.Reset();
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5s);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
me->CastSpell(me, SPELL_SNEAK, true); {
DoCastSelf(SPELL_SNEAK, true);
}
if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry()) if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry())
me->DespawnOrUnsummon(1); me->DespawnOrUnsummon(1);
@@ -77,18 +75,18 @@ public:
me->setActive(true); me->setActive(true);
if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) if (me->GetEntry() == NPC_HYAKISS_THE_LURKER)
{ {
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000); events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5s);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000); events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9s);
} }
else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER) else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER)
{ {
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000); events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4s);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000); events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7s);
events.ScheduleEvent(EVENT_SPELL_DIVE, 10000); events.ScheduleEvent(EVENT_SPELL_DIVE, 10s);
} }
else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER) else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER)
{ {
events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000); events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3s);
} }
} }
@@ -115,7 +113,7 @@ public:
me->RestoreFaction(); me->RestoreFaction();
} }
else else
_events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5s);
break; break;
} }
@@ -130,28 +128,27 @@ public:
{ {
case EVENT_SPELL_ACIDIC_FANG: case EVENT_SPELL_ACIDIC_FANG:
me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false); me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false);
events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000)); events.Repeat(12s, 18s);
break; break;
case EVENT_SPELL_HYAKISS_WEB: case EVENT_SPELL_HYAKISS_WEB:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) DoCastRandomTarget(SPELL_HYAKISS_WEB, 0, 30.0f);
me->CastSpell(target, SPELL_HYAKISS_WEB, false); events.Repeat(15s);
events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000);
break; break;
case EVENT_SPELL_SONIC_BURST: case EVENT_SPELL_SONIC_BURST:
me->CastSpell(me, SPELL_SONIC_BURST, false); DoCastSelf(SPELL_SONIC_BURST);
events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000)); events.Repeat(12s, 18s);
break; break;
case EVENT_SPELL_WING_BUFFET: case EVENT_SPELL_WING_BUFFET:
me->CastSpell(me, SPELL_WING_BUFFET, false); DoCastSelf(SPELL_WING_BUFFET);
events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000)); events.Repeat(12s, 18s);
break; break;
case EVENT_SPELL_DIVE: case EVENT_SPELL_DIVE:
if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, 40.0f, false, true))) if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, 40.0f, false, true)))
me->CastSpell(target, SPELL_DIVE, false); me->CastSpell(target, SPELL_DIVE, false);
events.ScheduleEvent(EVENT_SPELL_DIVE, 20000); events.Repeat(20s);
break; break;
case EVENT_SPELL_FEAR: case EVENT_SPELL_FEAR:
me->CastSpell(me->GetVictim(), SPELL_FEAR, false); DoCastVictim(SPELL_FEAR);
break; break;
case EVENT_SPELL_RAVAGE: case EVENT_SPELL_RAVAGE:
me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false); me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false);
@@ -166,13 +163,7 @@ public:
EventMap _events2; EventMap _events2;
}; };
CreatureAI* GetAI(Creature* creature) const override
{
return GetKarazhanAI<boss_servant_quartersAI>(creature);
}
};
void AddSC_boss_servant_quarters() void AddSC_boss_servant_quarters()
{ {
new boss_servant_quarters(); RegisterKarazhanCreatureAI(boss_servant_quarters);
} }