diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp | 1237 |
1 files changed, 547 insertions, 690 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index d35a7ea026a..3bed7f43837 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -125,197 +125,186 @@ enum Yells SAY_SEND_GROUP = 5 }; -class boss_krik_thir : public CreatureScript +struct boss_krik_thir : public BossAI { - public: - boss_krik_thir() : CreatureScript("boss_krik_thir") { } + boss_krik_thir(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { } + + void SummonAdds() + { + if (instance->GetBossState(DATA_KRIKTHIR) == DONE) + return; - struct boss_krik_thirAI : public BossAI + for (uint8 i = 1; i <= 3; ++i) { - boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR), _hadFrenzy(false), _petsInCombat(false), _watchersActive(0) { } + std::list<TempSummon*> adds; + me->SummonCreatureGroup(i, &adds); + for (TempSummon* add : adds) + add->AI()->SetData(DATA_PET_GROUP, i); + } + } - void SummonAdds() - { - if (instance->GetBossState(DATA_KRIKTHIR) == DONE) - return; + void Reset() override + { + BossAI::Reset(); + _hadFrenzy = false; + _petsInCombat = false; + _watchersActive = 0; + me->SetReactState(REACT_PASSIVE); + } - for (uint8 i = 1; i <= 3; ++i) - { - std::list<TempSummon*> adds; - me->SummonCreatureGroup(i, &adds); - for (TempSummon* add : adds) - add->AI()->SetData(DATA_PET_GROUP, i); - } - } + void JustAppeared() override + { + BossAI::JustAppeared(); + SummonAdds(); + } - void Reset() override - { - BossAI::Reset(); - _hadFrenzy = false; - _petsInCombat = false; - _watchersActive = 0; - me->SetReactState(REACT_PASSIVE); - } + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } - void JustAppeared() override - { - BossAI::JustAppeared(); - SummonAdds(); - } + void JustDied(Unit* /*killer*/) override + { + summons.clear(); + _JustDied(); + Talk(SAY_DEATH); + } - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } + void JustEngagedWith(Unit* who) override + { + _petsInCombat = false; + me->SetReactState(REACT_AGGRESSIVE); + summons.DoZoneInCombat(); - void JustDied(Unit* /*killer*/) override - { - summons.clear(); - _JustDied(); - Talk(SAY_DEATH); - } + events.CancelEvent(EVENT_SEND_GROUP); + events.ScheduleEvent(EVENT_SWARM, 5s); + events.ScheduleEvent(EVENT_MIND_FLAY, randtime(Seconds(1), Seconds(3))); - void JustEngagedWith(Unit* who) override - { - _petsInCombat = false; - me->SetReactState(REACT_AGGRESSIVE); - summons.DoZoneInCombat(); + BossAI::JustEngagedWith(who); + } - events.CancelEvent(EVENT_SEND_GROUP); - events.ScheduleEvent(EVENT_SWARM, 5s); - events.ScheduleEvent(EVENT_MIND_FLAY, randtime(Seconds(1), Seconds(3))); + void MoveInLineOfSight(Unit* who) override + { + if (!me->HasReactState(REACT_PASSIVE)) + { + ScriptedAI::MoveInLineOfSight(who); + return; + } - BossAI::JustEngagedWith(who); - } + if (me->CanStartAttack(who, false) && me->IsWithinDistInMap(who, me->GetAttackDistance(who) + me->m_CombatDistance)) + JustEngagedWith(who); + } - void MoveInLineOfSight(Unit* who) override - { - if (!me->HasReactState(REACT_PASSIVE)) + void EnterEvadeMode(EvadeReason /*why*/) override + { + summons.DespawnAll(); + _DespawnAtEvade(); + } + + void DoAction(int32 action) override + { + switch (action) + { + case -ACTION_GATEWATCHER_GREET: + if (!instance->GetData(DATA_GATEWATCHER_GREET) && me->IsAlive() && !me->IsInCombat() && !_petsInCombat) { - ScriptedAI::MoveInLineOfSight(who); + instance->SetData(DATA_GATEWATCHER_GREET, 1); + Talk(SAY_PREFIGHT); + } + break; + case ACTION_GASHRA_DIED: + case ACTION_NARJIL_DIED: + case ACTION_SILTHIK_DIED: + if (!_watchersActive) // something is wrong + { + EnterEvadeMode(EVADE_REASON_OTHER); return; } + if (!--_watchersActive) // if there are no watchers currently in combat... + events.RescheduleEvent(EVENT_SEND_GROUP, Seconds(5)); // ...send the next watcher after the targets sooner + break; + case ACTION_WATCHER_ENGAGED: + ++_watchersActive; + break; + case ACTION_PET_ENGAGED: + if (_petsInCombat || me->IsInCombat()) + break; + _petsInCombat = true; + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_SEND_GROUP, 70s); + break; + case ACTION_PET_EVADE: + EnterEvadeMode(EVADE_REASON_OTHER); + break; + } + } - if (me->CanStartAttack(who, false) && me->IsWithinDistInMap(who, me->GetAttackDistance(who) + me->m_CombatDistance)) - JustEngagedWith(who); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - summons.DespawnAll(); - _DespawnAtEvade(); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim() && !_petsInCombat) + return; - void DoAction(int32 action) override - { - switch (action) - { - case -ACTION_GATEWATCHER_GREET: - if (!instance->GetData(DATA_GATEWATCHER_GREET) && me->IsAlive() && !me->IsInCombat() && !_petsInCombat) - { - instance->SetData(DATA_GATEWATCHER_GREET, 1); - Talk(SAY_PREFIGHT); - } - break; - case ACTION_GASHRA_DIED: - case ACTION_NARJIL_DIED: - case ACTION_SILTHIK_DIED: - if (!_watchersActive) // something is wrong - { - EnterEvadeMode(EVADE_REASON_OTHER); - return; - } - if (!--_watchersActive) // if there are no watchers currently in combat... - events.RescheduleEvent(EVENT_SEND_GROUP, Seconds(5)); // ...send the next watcher after the targets sooner - break; - case ACTION_WATCHER_ENGAGED: - ++_watchersActive; - break; - case ACTION_PET_ENGAGED: - if (_petsInCombat || me->IsInCombat()) - break; - _petsInCombat = true; - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_SEND_GROUP, 70s); - break; - case ACTION_PET_EVADE: - EnterEvadeMode(EVADE_REASON_OTHER); - break; - } - } + events.Update(diff); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim() && !_petsInCombat) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - events.Update(diff); + if (me->HealthBelowPct(10) && !_hadFrenzy) + { + _hadFrenzy = true; + events.ScheduleEvent(EVENT_FRENZY, 1s); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SEND_GROUP: + DoCastAOE(SPELL_SUBBOSS_AGGRO_TRIGGER, true); + events.Repeat(Seconds(70)); + break; - if (me->HealthBelowPct(10) && !_hadFrenzy) - { - _hadFrenzy = true; - events.ScheduleEvent(EVENT_FRENZY, 1s); - } + case EVENT_SWARM: + DoCastAOE(SPELL_SWARM); + Talk(SAY_SWARM); + break; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SEND_GROUP: - DoCastAOE(SPELL_SUBBOSS_AGGRO_TRIGGER, true); - events.Repeat(Seconds(70)); - break; - - case EVENT_SWARM: - DoCastAOE(SPELL_SWARM); - Talk(SAY_SWARM); - break; - - case EVENT_MIND_FLAY: - DoCastVictim(SPELL_MIND_FLAY); - events.Repeat(randtime(Seconds(9), Seconds(11))); - break; - - case EVENT_FRENZY: - DoCastSelf(SPELL_FRENZY); - DoCastAOE(SPELL_CURSE_OF_FATIGUE); - events.Repeat(Seconds(15)); - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + case EVENT_MIND_FLAY: + DoCastVictim(SPELL_MIND_FLAY); + events.Repeat(randtime(Seconds(9), Seconds(11))); + break; - DoMeleeAttackIfReady(); + case EVENT_FRENZY: + DoCastSelf(SPELL_FRENZY); + DoCastAOE(SPELL_CURSE_OF_FATIGUE); + events.Repeat(Seconds(15)); + break; } - void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER) - DoZoneInCombat(); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER) - Talk(SAY_SEND_GROUP); - } + DoMeleeAttackIfReady(); + } - private: - bool _hadFrenzy; - bool _petsInCombat; - uint8 _watchersActive; - }; + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER) + DoZoneInCombat(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<boss_krik_thirAI>(creature); - } + void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER) + Talk(SAY_SEND_GROUP); + } + + private: + bool _hadFrenzy; + bool _petsInCombat; + uint8 _watchersActive; }; struct npc_gatewatcher_petAI : public ScriptedAI @@ -406,634 +395,502 @@ struct npc_gatewatcher_petAI : public ScriptedAI bool _isWatcher; }; -class npc_watcher_gashra : public CreatureScript +struct npc_watcher_gashra : public npc_gatewatcher_petAI { - public: - npc_watcher_gashra() : CreatureScript("npc_watcher_gashra") { } - - struct npc_watcher_gashraAI : public npc_gatewatcher_petAI - { - npc_watcher_gashraAI(Creature* creature) : npc_gatewatcher_petAI(creature, true) { } - - void Reset() override - { - _events.Reset(); - } + npc_watcher_gashra(Creature* creature) : npc_gatewatcher_petAI(creature, true) { } - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_ENRAGE, randtime(Seconds(3), Seconds(5))); - _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(16), Seconds(19))); - _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(7),Seconds(11))); - } + void Reset() override + { + _events.Reset(); + } - void JustDied(Unit* /*killer*/) override - { - Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); - if (krikthir && krikthir->IsAlive()) - krikthir->AI()->DoAction(ACTION_GASHRA_DIED); - } + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_ENRAGE, randtime(Seconds(3), Seconds(5))); + _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(16), Seconds(19))); + _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(7),Seconds(11))); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void JustDied(Unit* /*killer*/) override + { + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); + if (krikthir && krikthir->IsAlive()) + krikthir->AI()->DoAction(ACTION_GASHRA_DIED); + } - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ENRAGE: - DoCastSelf(SPELL_ENRAGE); - _events.Repeat(randtime(Seconds(12), Seconds(20))); - break; - case EVENT_WEB_WRAP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) - DoCast(target, SPELL_WEB_WRAP); - _events.Repeat(randtime(Seconds(13), Seconds(19))); - break; - case EVENT_INFECTED_BITE: - DoCastVictim(SPELL_INFECTED_BITE); - _events.Repeat(randtime(Seconds(23), Seconds(27))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); - } + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_ENRAGE: + DoCastSelf(SPELL_ENRAGE); + _events.Repeat(randtime(Seconds(12), Seconds(20))); + break; + case EVENT_WEB_WRAP: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f)) + DoCast(target, SPELL_WEB_WRAP); + _events.Repeat(randtime(Seconds(13), Seconds(19))); + break; + case EVENT_INFECTED_BITE: + DoCastVictim(SPELL_INFECTED_BITE); + _events.Repeat(randtime(Seconds(23), Seconds(27))); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - private: - EventMap _events; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_watcher_gashraAI>(creature); - } + private: + EventMap _events; }; -class npc_watcher_narjil : public CreatureScript +struct npc_watcher_narjil : public npc_gatewatcher_petAI { - public: - npc_watcher_narjil() : CreatureScript("npc_watcher_narjil") { } - - struct npc_watcher_narjilAI : public npc_gatewatcher_petAI - { - npc_watcher_narjilAI(Creature* creature) : npc_gatewatcher_petAI(creature, true) - { - } - - void Reset() override - { - _events.Reset(); - } + npc_watcher_narjil(Creature* creature) : npc_gatewatcher_petAI(creature, true) + { + } - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_BLINDING_WEBS, randtime(Seconds(13), Seconds(18))); - _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(3), Seconds(5))); - _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(7), Seconds(11))); - } + void Reset() override + { + _events.Reset(); + } - void JustDied(Unit* /*killer*/) override - { - Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); - if (krikthir && krikthir->IsAlive()) - krikthir->AI()->DoAction(ACTION_NARJIL_DIED); - } + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_BLINDING_WEBS, randtime(Seconds(13), Seconds(18))); + _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(3), Seconds(5))); + _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(7), Seconds(11))); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void JustDied(Unit* /*killer*/) override + { + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); + if (krikthir && krikthir->IsAlive()) + krikthir->AI()->DoAction(ACTION_NARJIL_DIED); + } - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BLINDING_WEBS: - DoCastVictim(SPELL_BLINDING_WEBS); - _events.Repeat(randtime(Seconds(23), Seconds(27))); - break; - case EVENT_WEB_WRAP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - DoCast(target, SPELL_WEB_WRAP); - _events.Repeat(randtime(Seconds(13), Seconds(19))); - break; - case EVENT_INFECTED_BITE: - DoCastVictim(SPELL_INFECTED_BITE); - _events.Repeat(randtime(Seconds(20), Seconds(25))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); - } + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BLINDING_WEBS: + DoCastVictim(SPELL_BLINDING_WEBS); + _events.Repeat(randtime(Seconds(23), Seconds(27))); + break; + case EVENT_WEB_WRAP: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + DoCast(target, SPELL_WEB_WRAP); + _events.Repeat(randtime(Seconds(13), Seconds(19))); + break; + case EVENT_INFECTED_BITE: + DoCastVictim(SPELL_INFECTED_BITE); + _events.Repeat(randtime(Seconds(20), Seconds(25))); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - private: - EventMap _events; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_watcher_narjilAI>(creature); - } + private: + EventMap _events; }; -class npc_watcher_silthik : public CreatureScript +struct npc_watcher_silthik : public npc_gatewatcher_petAI { - public: - npc_watcher_silthik() : CreatureScript("npc_watcher_silthik") { } - - struct npc_watcher_silthikAI : public npc_gatewatcher_petAI - { - npc_watcher_silthikAI(Creature* creature) : npc_gatewatcher_petAI(creature, true) - { - } - - void Reset() override - { - _events.Reset(); - } + npc_watcher_silthik(Creature* creature) : npc_gatewatcher_petAI(creature, true) + { + } - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_POISON_SPRAY, randtime(Seconds(16), Seconds(19))); - _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(7), Seconds(11))); - _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(3), Seconds(5))); - } + void Reset() override + { + _events.Reset(); + } - void JustDied(Unit* /*killer*/) override - { - Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); - if (krikthir && krikthir->IsAlive()) - krikthir->AI()->DoAction(ACTION_SILTHIK_DIED); - } + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_POISON_SPRAY, randtime(Seconds(16), Seconds(19))); + _events.ScheduleEvent(EVENT_WEB_WRAP, randtime(Seconds(7), Seconds(11))); + _events.ScheduleEvent(EVENT_INFECTED_BITE, randtime(Seconds(3), Seconds(5))); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void JustDied(Unit* /*killer*/) override + { + Creature* krikthir = _instance->GetCreature(DATA_KRIKTHIR); + if (krikthir && krikthir->IsAlive()) + krikthir->AI()->DoAction(ACTION_SILTHIK_DIED); + } - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_POISON_SPRAY: - DoCastVictim(SPELL_POISON_SPRAY); - _events.Repeat(randtime(Seconds(13), Seconds(19))); - break; - case EVENT_WEB_WRAP: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - DoCast(target, SPELL_WEB_WRAP); - _events.Repeat(randtime(Seconds(13), Seconds(17))); - break; - case EVENT_INFECTED_BITE: - DoCastVictim(SPELL_INFECTED_BITE); - _events.Repeat(randtime(Seconds(20), Seconds(24))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); - } + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_POISON_SPRAY: + DoCastVictim(SPELL_POISON_SPRAY); + _events.Repeat(randtime(Seconds(13), Seconds(19))); + break; + case EVENT_WEB_WRAP: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + DoCast(target, SPELL_WEB_WRAP); + _events.Repeat(randtime(Seconds(13), Seconds(17))); + break; + case EVENT_INFECTED_BITE: + DoCastVictim(SPELL_INFECTED_BITE); + _events.Repeat(randtime(Seconds(20), Seconds(24))); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - private: - EventMap _events; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_watcher_silthikAI>(creature); - } + private: + EventMap _events; }; -class npc_anub_ar_warrior : public CreatureScript +struct npc_anub_ar_warrior : public npc_gatewatcher_petAI { - public: - npc_anub_ar_warrior() : CreatureScript("npc_anub_ar_warrior") { } - - struct npc_anub_ar_warriorAI : public npc_gatewatcher_petAI - { - npc_anub_ar_warriorAI(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } - - void Reset() override - { - _events.Reset(); - } + npc_anub_ar_warrior(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_CLEAVE, randtime(Seconds(7), Seconds(9))); - _events.ScheduleEvent(EVENT_STRIKE, randtime(Seconds(5), Seconds(10))); - } + void Reset() override + { + _events.Reset(); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_CLEAVE, randtime(Seconds(7), Seconds(9))); + _events.ScheduleEvent(EVENT_STRIKE, randtime(Seconds(5), Seconds(10))); + } - _events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - _events.Repeat(randtime(Seconds(10), Seconds(16))); - break; - case EVENT_STRIKE: - DoCastVictim(SPELL_STRIKE); - _events.Repeat(randtime(Seconds(15), Seconds(19))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - DoMeleeAttackIfReady(); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + _events.Repeat(randtime(Seconds(10), Seconds(16))); + break; + case EVENT_STRIKE: + DoCastVictim(SPELL_STRIKE); + _events.Repeat(randtime(Seconds(15), Seconds(19))); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_anub_ar_warriorAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class npc_anub_ar_skirmisher : public CreatureScript +struct npc_anub_ar_skirmisher : public npc_gatewatcher_petAI { - public: - npc_anub_ar_skirmisher() : CreatureScript("npc_anub_ar_skirmisher") { } - - struct npc_anub_ar_skirmisherAI : public npc_gatewatcher_petAI - { - npc_anub_ar_skirmisherAI(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } + npc_anub_ar_skirmisher(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } - void Reset() override - { - _events.Reset(); - } - - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_ANUBAR_CHARGE, randtime(Seconds(6), Seconds(8))); - _events.ScheduleEvent(EVENT_BACKSTAB, randtime(Seconds(7), Seconds(9))); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void Reset() override + { + _events.Reset(); + } - _events.Update(diff); + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_ANUBAR_CHARGE, randtime(Seconds(6), Seconds(8))); + _events.ScheduleEvent(EVENT_BACKSTAB, randtime(Seconds(7), Seconds(9))); + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ANUBAR_CHARGE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - DoCast(target, SPELL_CHARGE); - _events.Repeat(randtime(Seconds(20), Seconds(25))); - break; - case EVENT_BACKSTAB: - if (me->GetVictim() && me->GetVictim()->isInBack(me)) - DoCastVictim(SPELL_BACKSTAB); - _events.Repeat(randtime(Seconds(10), Seconds(13))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + _events.Update(diff); - DoMeleeAttackIfReady(); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - Unit* unitTarget = target->ToUnit(); - if (!unitTarget) - return; - - if (spellInfo->Id == SPELL_CHARGE) - DoCast(unitTarget, SPELL_FIXATE_TRIGGER); + case EVENT_ANUBAR_CHARGE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + DoCast(target, SPELL_CHARGE); + _events.Repeat(randtime(Seconds(20), Seconds(25))); + break; + case EVENT_BACKSTAB: + if (me->GetVictim() && me->GetVictim()->isInBack(me)) + DoCastVictim(SPELL_BACKSTAB); + _events.Repeat(randtime(Seconds(10), Seconds(13))); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_anub_ar_skirmisherAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } -}; - -class npc_anub_ar_shadowcaster : public CreatureScript -{ - public: - npc_anub_ar_shadowcaster() : CreatureScript("npc_anub_ar_shadowcaster") { } - - struct npc_anub_ar_shadowcasterAI : public npc_gatewatcher_petAI - { - npc_anub_ar_shadowcasterAI(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } - void Reset() override - { - _events.Reset(); - } + DoMeleeAttackIfReady(); + } - void _JustEngagedWith() override - { - _events.ScheduleEvent(EVENT_SHADOW_BOLT, 4s); - _events.ScheduleEvent(EVENT_SHADOW_NOVA, randtime(Seconds(10), Seconds(14))); - } + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + { + Unit* unitTarget = target->ToUnit(); + if (!unitTarget) + return; - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + if (spellInfo->Id == SPELL_CHARGE) + DoCast(unitTarget, SPELL_FIXATE_TRIGGER); + } +}; - _events.Update(diff); +struct npc_anub_ar_shadowcaster : public npc_gatewatcher_petAI +{ + npc_anub_ar_shadowcaster(Creature* creature) : npc_gatewatcher_petAI(creature, false) { } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + void Reset() override + { + _events.Reset(); + } - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHADOW_BOLT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - DoCast(target, SPELL_SHADOW_BOLT); - _events.Repeat(randtime(Seconds(2), Seconds(4))); - break; - case EVENT_SHADOW_NOVA: - DoCastVictim(SPELL_SHADOW_NOVA); - _events.Repeat(randtime(Seconds(10), Seconds(16))); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } + void _JustEngagedWith() override + { + _events.ScheduleEvent(EVENT_SHADOW_BOLT, 4s); + _events.ScheduleEvent(EVENT_SHADOW_NOVA, randtime(Seconds(10), Seconds(14))); + } - DoMeleeAttackIfReady(); - } - }; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_anub_ar_shadowcasterAI>(creature); - } -}; + _events.Update(diff); -class npc_skittering_swarmer : public CreatureScript -{ - public: - npc_skittering_swarmer() : CreatureScript("npc_skittering_swarmer") { } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - struct npc_skittering_swarmerAI : public ScriptedAI + while (uint32 eventId = _events.ExecuteEvent()) { - npc_skittering_swarmerAI(Creature* creature) : ScriptedAI(creature) { } - - void InitializeAI() override + switch (eventId) { - ScriptedAI::InitializeAI(); - if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR)) - { - if (Unit* target = gatewatcher->getAttackerForHelper()) - AttackStart(target); - gatewatcher->AI()->JustSummoned(me); - } + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + DoCast(target, SPELL_SHADOW_BOLT); + _events.Repeat(randtime(Seconds(2), Seconds(4))); + break; + case EVENT_SHADOW_NOVA: + DoCastVictim(SPELL_SHADOW_NOVA); + _events.Repeat(randtime(Seconds(10), Seconds(16))); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_skittering_swarmerAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class npc_skittering_infector : public CreatureScript +struct npc_skittering_swarmer : public ScriptedAI { - public: - npc_skittering_infector() : CreatureScript("npc_skittering_infector") { } - - struct npc_skittering_infectorAI : public ScriptedAI - { - npc_skittering_infectorAI(Creature* creature) : ScriptedAI(creature) { } + npc_skittering_swarmer(Creature* creature) : ScriptedAI(creature) { } - void InitializeAI() override - { - ScriptedAI::InitializeAI(); - if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR)) - { - if (Unit* target = gatewatcher->getAttackerForHelper()) - AttackStart(target); - gatewatcher->AI()->JustSummoned(me); - } - } - - void JustDied(Unit* killer) override - { - DoCastAOE(SPELL_ACID_SPLASH); - ScriptedAI::JustDied(killer); - } - }; - - CreatureAI* GetAI(Creature* creature) const override + void InitializeAI() override + { + ScriptedAI::InitializeAI(); + if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR)) { - return GetAzjolNerubAI<npc_skittering_infectorAI>(creature); + if (Unit* target = gatewatcher->getAttackerForHelper()) + AttackStart(target); + gatewatcher->AI()->JustSummoned(me); } + } }; -class npc_gatewatcher_web_wrap : public CreatureScript +struct npc_skittering_infector : public ScriptedAI { - public: - npc_gatewatcher_web_wrap() : CreatureScript("npc_gatewatcher_web_wrap") { } + npc_skittering_infector(Creature* creature) : ScriptedAI(creature) { } - struct npc_gatewatcher_web_wrapAI : public NullCreatureAI + void InitializeAI() override + { + ScriptedAI::InitializeAI(); + if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR)) { - npc_gatewatcher_web_wrapAI(Creature* creature) : NullCreatureAI(creature) { } + if (Unit* target = gatewatcher->getAttackerForHelper()) + AttackStart(target); + gatewatcher->AI()->JustSummoned(me); + } + } - void JustDied(Unit* /*killer*/) override - { - if (TempSummon* meSummon = me->ToTempSummon()) - if (Unit* summoner = meSummon->GetSummonerUnit()) - summoner->RemoveAurasDueToSpell(SPELL_WEB_WRAP_WRAPPED); - } - }; + void JustDied(Unit* killer) override + { + DoCastAOE(SPELL_ACID_SPLASH); + ScriptedAI::JustDied(killer); + } +}; - CreatureAI* GetAI(Creature* creature) const override - { - return GetAzjolNerubAI<npc_gatewatcher_web_wrapAI>(creature); - } +struct npc_gatewatcher_web_wrap : public NullCreatureAI +{ + npc_gatewatcher_web_wrap(Creature* creature) : NullCreatureAI(creature) { } + + void JustDied(Unit* /*killer*/) override + { + if (TempSummon* meSummon = me->ToTempSummon()) + if (Unit* summoner = meSummon->GetSummonerUnit()) + summoner->RemoveAurasDueToSpell(SPELL_WEB_WRAP_WRAPPED); + } }; // 52343 - Krik'Thir Subboss Aggro Trigger -class spell_gatewatcher_subboss_trigger : public SpellScriptLoader +class spell_gatewatcher_subboss_trigger : public SpellScript { - public: - spell_gatewatcher_subboss_trigger() : SpellScriptLoader("spell_gatewatcher_subboss_trigger") { } + PrepareSpellScript(spell_gatewatcher_subboss_trigger); - class spell_gatewatcher_subboss_trigger_SpellScript : public SpellScript + void HandleTargets(std::list<WorldObject*>& targetList) + { + // Remove any Watchers that are already in combat + auto it = targetList.begin(); + while (it != targetList.end()) { - PrepareSpellScript(spell_gatewatcher_subboss_trigger_SpellScript); - - void HandleTargets(std::list<WorldObject*>& targetList) - { - // Remove any Watchers that are already in combat - auto it = targetList.begin(); - while (it != targetList.end()) + if (Creature* creature = (*it)->ToCreature()) + if (creature->IsAlive() && !creature->IsInCombat()) { - if (Creature* creature = (*it)->ToCreature()) - if (creature->IsAlive() && !creature->IsInCombat()) - { - ++it; - continue; - } - it = targetList.erase(it); + ++it; + continue; } + it = targetList.erase(it); + } - // Default to Krik'thir himself if he isn't engaged - WorldObject* target = nullptr; - if (GetCaster() && !GetCaster()->IsInCombat()) - target = GetCaster(); - // Unless there are Watchers that aren't engaged yet - if (!targetList.empty()) - { - // If there are, pick one of them at random - target = Trinity::Containers::SelectRandomContainerElement(targetList); - } - // And hit only that one - targetList.clear(); - if (target) - targetList.push_back(target); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gatewatcher_subboss_trigger_SpellScript::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - } - }; - - SpellScript* GetSpellScript() const override + // Default to Krik'thir himself if he isn't engaged + WorldObject* target = nullptr; + if (GetCaster() && !GetCaster()->IsInCombat()) + target = GetCaster(); + // Unless there are Watchers that aren't engaged yet + if (!targetList.empty()) { - return new spell_gatewatcher_subboss_trigger_SpellScript(); + // If there are, pick one of them at random + target = Trinity::Containers::SelectRandomContainerElement(targetList); } + // And hit only that one + targetList.clear(); + if (target) + targetList.push_back(target); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gatewatcher_subboss_trigger::HandleTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + } }; // 52536 - Fixate Trigger -class spell_anub_ar_skirmisher_fixate : public SpellScriptLoader +class spell_anub_ar_skirmisher_fixate : public SpellScript { - public: - spell_anub_ar_skirmisher_fixate() : SpellScriptLoader("spell_anub_ar_skirmisher_fixate") { } - - class spell_anub_ar_skirmisher_fixate_SpellScript : public SpellScript - { - PrepareSpellScript(spell_anub_ar_skirmisher_fixate_SpellScript); + PrepareSpellScript(spell_anub_ar_skirmisher_fixate); - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_FIXATE_TRIGGERED }); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGERED, true); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_FIXATE_TRIGGERED }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_anub_ar_skirmisher_fixate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGERED, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_anub_ar_skirmisher_fixate_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_anub_ar_skirmisher_fixate::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 52086 - Web Wrap -class spell_gatewatcher_web_wrap : public SpellScriptLoader +class spell_gatewatcher_web_wrap : public AuraScript { - public: - spell_gatewatcher_web_wrap() : SpellScriptLoader("spell_gatewatcher_web_wrap") { } + PrepareAuraScript(spell_gatewatcher_web_wrap); - class spell_gatewatcher_web_wrap_AuraScript : public AuraScript - { - PrepareAuraScript(spell_gatewatcher_web_wrap_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_WEB_WRAP_WRAPPED }); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_WEB_WRAP_WRAPPED }); + } - if (Unit* target = GetTarget()) - target->CastSpell(target, SPELL_WEB_WRAP_WRAPPED, true); - } + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_gatewatcher_web_wrap_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); - } - }; + if (Unit* target = GetTarget()) + target->CastSpell(target, SPELL_WEB_WRAP_WRAPPED, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_gatewatcher_web_wrap_AuraScript(); - } + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_gatewatcher_web_wrap::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); + } }; class achievement_watch_him_die : public AchievementCriteriaScript @@ -1064,23 +921,23 @@ class achievement_watch_him_die : public AchievementCriteriaScript void AddSC_boss_krik_thir() { - new boss_krik_thir(); + RegisterAzjolNerubCreatureAI(boss_krik_thir); - new npc_watcher_gashra(); - new npc_watcher_narjil(); - new npc_watcher_silthik(); + RegisterAzjolNerubCreatureAI(npc_watcher_gashra); + RegisterAzjolNerubCreatureAI(npc_watcher_narjil); + RegisterAzjolNerubCreatureAI(npc_watcher_silthik); - new npc_anub_ar_warrior(); - new npc_anub_ar_skirmisher(); - new npc_anub_ar_shadowcaster(); + RegisterAzjolNerubCreatureAI(npc_anub_ar_warrior); + RegisterAzjolNerubCreatureAI(npc_anub_ar_skirmisher); + RegisterAzjolNerubCreatureAI(npc_anub_ar_shadowcaster); - new npc_skittering_swarmer(); - new npc_skittering_infector(); - new npc_gatewatcher_web_wrap(); + RegisterAzjolNerubCreatureAI(npc_skittering_swarmer); + RegisterAzjolNerubCreatureAI(npc_skittering_infector); + RegisterAzjolNerubCreatureAI(npc_gatewatcher_web_wrap); - new spell_gatewatcher_subboss_trigger(); - new spell_anub_ar_skirmisher_fixate(); - new spell_gatewatcher_web_wrap(); + RegisterSpellScript(spell_gatewatcher_subboss_trigger); + RegisterSpellScript(spell_anub_ar_skirmisher_fixate); + RegisterSpellScript(spell_gatewatcher_web_wrap); new achievement_watch_him_die(); } |