diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp index 542544491..feb651db6 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_maiden_of_virtue.cpp @@ -49,10 +49,10 @@ struct boss_maiden_of_virtue : public BossAI Talk(SAY_AGGRO); DoCastAOE(SPELL_HOLY_GROUND, true); - events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25000); - events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8000); - events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); + events.ScheduleEvent(EVENT_SPELL_REPENTANCE, 25s); + events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, 8s); + events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, 15s); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 10min); } void KilledUnit(Unit* /*victim*/) override @@ -60,7 +60,7 @@ struct boss_maiden_of_virtue : public BossAI if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { 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: DoCastAOE(SPELL_REPENTANCE, true); Talk(SAY_REPENTANCE); - events.ScheduleEvent(EVENT_SPELL_REPENTANCE, urand(25000, 35000)); + events.Repeat(25s, 35s); break; case EVENT_SPELL_HOLY_FIRE: DoCastRandomTarget(SPELL_HOLY_FIRE, 0, 50.0f); - events.ScheduleEvent(EVENT_SPELL_HOLY_FIRE, urand(8000, 18000)); + events.Repeat(8s, 18s); break; case EVENT_SPELL_HOLY_WRATH: DoCastRandomTarget(SPELL_HOLY_WRATH, 0, 80.0f); - events.ScheduleEvent(EVENT_SPELL_HOLY_WRATH, urand(20000, 25000)); + events.Repeat(20s, 25s); break; case EVENT_SPELL_ENRAGE: DoCastSelf(SPELL_BERSERK, true); diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp index 48aa30fd8..e1bb36495 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_moroes.cpp @@ -78,184 +78,164 @@ const uint32 GuestEntries[6] = 19876, }; -class boss_moroes : public CreatureScript +struct boss_moroes : public BossAI { -public: - boss_moroes() : CreatureScript("boss_moroes") { } - - struct boss_moroesAI : public BossAI + boss_moroes(Creature* creature) : BossAI(creature, DATA_MOROES) { - boss_moroesAI(Creature* creature) : BossAI(creature, DATA_MOROES) + _activeGuests = 0; + } + + void InitializeAI() override + { + BossAI::InitializeAI(); + InitializeGuests(); + } + + void JustReachedHome() override + { + BossAI::JustReachedHome(); + InitializeGuests(); + } + + void InitializeGuests() + { + if (!me->IsAlive()) + return; + + if (_activeGuests == 0) { - _activeGuests = 0; - instance = creature->GetInstanceScript(); + _activeGuests |= 0x3F; + uint8 rand1 = RAND(0x01, 0x02, 0x04); + uint8 rand2 = RAND(0x08, 0x10, 0x20); + _activeGuests &= ~(rand1 | rand2); } - InstanceScript* instance; + for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i) + if ((1 << i) & _activeGuests) + me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN); - void InitializeAI() override + _events2.Reset(); + _events2.ScheduleEvent(EVENT_GUEST_TALK, 10s); + } + + void Reset() override + { + BossAI::Reset(); + DoCastSelf(SPELL_DUAL_WIELD, true); + } + + void EnterCombat(Unit* who) override + { + BossAI::EnterCombat(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_SPELL_VANISH, 30s); + events.ScheduleEvent(EVENT_SPELL_BLIND, 20s); + events.ScheduleEvent(EVENT_SPELL_GOUGE, 13s); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 5s); + events.ScheduleEvent(EVENT_SPELL_ENRAGE, 10min); + + _events2.Reset(); + me->CallForHelp(20.0f); + DoZoneInCombat(); + } + + void KilledUnit(Unit* /*victim*/) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { - BossAI::InitializeAI(); - InitializeGuests(); + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 5s); + } + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); + } + + Creature* GetRandomGuest() + { + std::list guestList; + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) + guestList.push_back(summon); + + return Acore::Containers::SelectRandomContainerElement(guestList); + } + + void UpdateAI(uint32 diff) override + { + _events2.Update(diff); + switch (_events2.ExecuteEvent()) + { + case EVENT_GUEST_TALK: + if (Creature* guest = GetRandomGuest()) + guest->AI()->Talk(SAY_GUEST); + _events2.Repeat(5s); + break; + case EVENT_GUEST_TALK2: + Talk(SAY_OUT_OF_COMBAT); + _events2.Repeat(1min, 2min); + break; } - void JustReachedHome() override - { - BossAI::JustReachedHome(); - InitializeGuests(); - } + if (!UpdateVictim()) + return; - void InitializeGuests() + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (!me->IsAlive()) + case EVENT_CHECK_HEALTH: + if (me->HealthBelowPct(31)) + { + DoCastSelf(SPELL_FRENZY, true); + break; + } + events.Repeat(1s); + break; + case EVENT_SPELL_ENRAGE: + DoCastSelf(SPELL_BERSERK, true); + break; + case EVENT_SPELL_BLIND: + if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 10.0f, true)) + { + DoCast(target, SPELL_BLIND); + } + events.Repeat(25s, 40s); + break; + case EVENT_SPELL_GOUGE: + DoCastVictim(SPELL_GOUGE); + events.Repeat(25s, 40s); return; - - if (_activeGuests == 0) - { - _activeGuests |= 0x3F; - uint8 rand1 = RAND(0x01, 0x02, 0x04); - uint8 rand2 = RAND(0x08, 0x10, 0x20); - _activeGuests &= ~(rand1 | rand2); - } - - for (uint8 i = 0; i < MAX_GUEST_COUNT; ++i) - if ((1 << i) & _activeGuests) - me->SummonCreature(GuestEntries[i], GuestsPosition[summons.size()], TEMPSUMMON_MANUAL_DESPAWN); - - _events2.Reset(); - _events2.ScheduleEvent(EVENT_GUEST_TALK, 10000); - } - - void Reset() override - { - BossAI::Reset(); - me->CastSpell(me, SPELL_DUAL_WIELD, true); - } - - void EnterCombat(Unit* who) override - { - BossAI::EnterCombat(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); - events.ScheduleEvent(EVENT_SPELL_BLIND, 20000); - events.ScheduleEvent(EVENT_SPELL_GOUGE, 13000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 5000); - events.ScheduleEvent(EVENT_SPELL_ENRAGE, 600000); - - _events2.Reset(); - me->CallForHelp(20.0f); - DoZoneInCombat(); - } - - void KilledUnit(Unit* /*victim*/) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 5000); - } - } - - void JustDied(Unit* killer) override - { - summons.clear(); - BossAI::JustDied(killer); - Talk(SAY_DEATH); - instance->SetBossState(DATA_MOROES, DONE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_GARROTE); - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - } - - Creature* GetRandomGuest() - { - std::list guestList; - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ++i) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i)) - guestList.push_back(summon); - - return Acore::Containers::SelectRandomContainerElement(guestList); - } - - void UpdateAI(uint32 diff) override - { - _events2.Update(diff); - switch (_events2.ExecuteEvent()) - { - case EVENT_GUEST_TALK: - if (Creature* guest = GetRandomGuest()) - guest->AI()->Talk(SAY_GUEST); - _events2.ScheduleEvent(EVENT_GUEST_TALK2, 5000); - break; - case EVENT_GUEST_TALK2: - Talk(SAY_OUT_OF_COMBAT); - _events2.ScheduleEvent(EVENT_GUEST_TALK, urand(60000, 120000)); - break; - } - - if (!UpdateVictim()) + case EVENT_SPELL_VANISH: + events.DelayEvents(9s); + events.SetPhase(1); + DoCastSelf(SPELL_VANISH); + events.Repeat(30s); + events.ScheduleEvent(EVENT_SPELL_GARROTE, 5s, 7s); return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_CHECK_HEALTH: - if (me->HealthBelowPct(31)) - { - me->CastSpell(me, SPELL_FRENZY, true); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - break; - case EVENT_SPELL_ENRAGE: - me->CastSpell(me, SPELL_BERSERK, true); - break; - case EVENT_SPELL_BLIND: - if (Unit* target = SelectTarget(SelectTargetMethod::MaxThreat, 1, 10.0f, true)) - me->CastSpell(target, SPELL_BLIND, false); - events.ScheduleEvent(EVENT_SPELL_BLIND, urand(25000, 40000)); - break; - case EVENT_SPELL_GOUGE: - me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); - events.ScheduleEvent(EVENT_SPELL_GOUGE, urand(25000, 40000)); - return; - case EVENT_SPELL_VANISH: - events.DelayEvents(9000); - events.SetPhase(1); - me->CastSpell(me, SPELL_VANISH, false); - events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); - events.ScheduleEvent(EVENT_SPELL_GARROTE, urand(5000, 7000)); - return; - case EVENT_SPELL_GARROTE: - Talk(SAY_SPECIAL); - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - target->CastSpell(target, SPELL_GARROTE, true); - me->CastSpell(me, SPELL_VANISH_TELEPORT, false); - events.SetPhase(0); - break; - } - - // Xinef: not in vanish - if (events.GetPhaseMask() == 0) - DoMeleeAttackIfReady(); + case EVENT_SPELL_GARROTE: + Talk(SAY_SPECIAL); + DoCastRandomTarget(SPELL_GARROTE, 0, 100.0f, true, true); + DoCastSelf(SPELL_VANISH_TELEPORT); + events.SetPhase(0); + break; } + // Xinef: not in vanish + if (events.GetPhaseMask() == 0) + DoMeleeAttackIfReady(); + } + private: EventMap _events2; uint8 _activeGuests; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetKarazhanAI(creature); - } }; class spell_moroes_vanish : public SpellScriptLoader @@ -293,6 +273,6 @@ public: void AddSC_boss_moroes() { - new boss_moroes(); + RegisterKarazhanCreatureAI(boss_moroes); new spell_moroes_vanish(); } diff --git a/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp index 60d920f64..aad9deaec 100644 --- a/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp +++ b/src/server/scripts/EasternKingdoms/Karazhan/boss_servant_quarters.cpp @@ -48,131 +48,122 @@ enum ServantQuertersMisc EVENT_CHECK_VISIBILITY = 30 }; -class boss_servant_quarters : public CreatureScript +struct boss_servant_quarters : public BossAI { -public: - boss_servant_quarters() : CreatureScript("boss_servant_quarters") { } + boss_servant_quarters(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { } - struct boss_servant_quartersAI : public BossAI + void Reset() override { - boss_servant_quartersAI(Creature* creature) : BossAI(creature, DATA_SERVANT_QUARTERS) { } + events.Reset(); + me->SetVisible(false); + me->SetReactState(REACT_PASSIVE); + me->SetFaction(FACTION_FRIENDLY); + _events2.Reset(); + _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5s); - void Reset() override + if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) { - events.Reset(); - me->SetVisible(false); - me->SetReactState(REACT_PASSIVE); - me->SetFaction(FACTION_FRIENDLY); - _events2.Reset(); - _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); - if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) - me->CastSpell(me, SPELL_SNEAK, true); - - if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry()) - me->DespawnOrUnsummon(1); + DoCastSelf(SPELL_SNEAK, true); } - void EnterCombat(Unit* /*who*/) override + if (instance->GetData(DATA_SELECTED_RARE) != me->GetEntry()) + me->DespawnOrUnsummon(1); + } + + void EnterCombat(Unit* /*who*/) override + { + me->setActive(true); + if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) { - me->setActive(true); - if (me->GetEntry() == NPC_HYAKISS_THE_LURKER) - { - events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5000); - events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9000); - } - else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER) - { - events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4000); - events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7000); - events.ScheduleEvent(EVENT_SPELL_DIVE, 10000); - } - else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER) - { - events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3000); - } + events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, 5s); + events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 9s); + } + else if (me->GetEntry() == NPC_SHADIKITH_THE_GLIDER) + { + events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, 4s); + events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, 7s); + events.ScheduleEvent(EVENT_SPELL_DIVE, 10s); + } + else // if (me->GetEntry() == NPC_ROKAD_THE_RAVAGER) + { + events.ScheduleEvent(EVENT_SPELL_RAVAGE, 3s); + } + } + + void JustDied(Unit* /*who*/) override + { + } + + void MovementInform(uint32 type, uint32 point) override + { + if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE) + events.ScheduleEvent(EVENT_SPELL_FEAR, 0); + } + + void UpdateAI(uint32 diff) override + { + _events2.Update(diff); + switch (_events2.ExecuteEvent()) + { + case EVENT_CHECK_VISIBILITY: + if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE) + { + me->SetVisible(true); + me->SetReactState(REACT_AGGRESSIVE); + me->RestoreFaction(); + } + else + _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5s); + break; } - void JustDied(Unit* /*who*/) override + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { + case EVENT_SPELL_ACIDIC_FANG: + me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false); + events.Repeat(12s, 18s); + break; + case EVENT_SPELL_HYAKISS_WEB: + DoCastRandomTarget(SPELL_HYAKISS_WEB, 0, 30.0f); + events.Repeat(15s); + break; + case EVENT_SPELL_SONIC_BURST: + DoCastSelf(SPELL_SONIC_BURST); + events.Repeat(12s, 18s); + break; + case EVENT_SPELL_WING_BUFFET: + DoCastSelf(SPELL_WING_BUFFET); + events.Repeat(12s, 18s); + break; + case EVENT_SPELL_DIVE: + if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, 40.0f, false, true))) + me->CastSpell(target, SPELL_DIVE, false); + events.Repeat(20s); + break; + case EVENT_SPELL_FEAR: + DoCastVictim(SPELL_FEAR); + break; + case EVENT_SPELL_RAVAGE: + me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false); + events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500); + break; } - void MovementInform(uint32 type, uint32 point) override - { - if (type == POINT_MOTION_TYPE && point == EVENT_CHARGE) - events.ScheduleEvent(EVENT_SPELL_FEAR, 0); - } - - void UpdateAI(uint32 diff) override - { - _events2.Update(diff); - switch (_events2.ExecuteEvent()) - { - case EVENT_CHECK_VISIBILITY: - if (instance->GetBossState(DATA_SERVANT_QUARTERS) == DONE) - { - me->SetVisible(true); - me->SetReactState(REACT_AGGRESSIVE); - me->RestoreFaction(); - } - else - _events2.ScheduleEvent(EVENT_CHECK_VISIBILITY, 5000); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_ACIDIC_FANG: - me->CastSpell(me->GetVictim(), SPELL_ACIDIC_FANG, false); - events.ScheduleEvent(EVENT_SPELL_ACIDIC_FANG, urand(12000, 18000)); - break; - case EVENT_SPELL_HYAKISS_WEB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, SPELL_HYAKISS_WEB, false); - events.ScheduleEvent(EVENT_SPELL_HYAKISS_WEB, 15000); - break; - case EVENT_SPELL_SONIC_BURST: - me->CastSpell(me, SPELL_SONIC_BURST, false); - events.ScheduleEvent(EVENT_SPELL_SONIC_BURST, urand(12000, 18000)); - break; - case EVENT_SPELL_WING_BUFFET: - me->CastSpell(me, SPELL_WING_BUFFET, false); - events.ScheduleEvent(EVENT_SPELL_WING_BUFFET, urand(12000, 18000)); - break; - case EVENT_SPELL_DIVE: - if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, 40.0f, false, true))) - me->CastSpell(target, SPELL_DIVE, false); - events.ScheduleEvent(EVENT_SPELL_DIVE, 20000); - break; - case EVENT_SPELL_FEAR: - me->CastSpell(me->GetVictim(), SPELL_FEAR, false); - break; - case EVENT_SPELL_RAVAGE: - me->CastSpell(me->GetVictim(), SPELL_RAVAGE, false); - events.ScheduleEvent(EVENT_SPELL_RAVAGE, 10500); - break; - } - - DoMeleeAttackIfReady(); - } + DoMeleeAttackIfReady(); + } private: EventMap _events2; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetKarazhanAI(creature); - } }; void AddSC_boss_servant_quarters() { - new boss_servant_quarters(); + RegisterKarazhanCreatureAI(boss_servant_quarters); }