From 46f12f78e063a9a4684667269e9f032fc3a86a66 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 6 Sep 2025 10:21:00 -0300 Subject: fix(Scripts/AzjolNerub): Modernize Krikthir the Gatewatcher script (#22647) Co-authored-by: sudlud --- .../Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h | 7 +- .../AzjolNerub/AzjolNerub/boss_hadronox.cpp | 6 +- .../AzjolNerub/boss_krikthir_the_gatewatcher.cpp | 177 ++++++++++----------- .../AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp | 70 +++----- 4 files changed, 109 insertions(+), 151 deletions(-) (limited to 'src/server') diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index c124b44572..39f15f6ab6 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -26,14 +26,17 @@ enum ANData { - DATA_KRIKTHIR_THE_GATEWATCHER_EVENT = 0, - DATA_HADRONOX_EVENT = 1, + DATA_KRIKTHIR = 0, + DATA_HADRONOX = 1, DATA_ANUBARAK_EVENT = 2, MAX_ENCOUNTERS = 3 }; enum ANIds { + NPC_WATCHER_NARJIL = 28729, + NPC_WATCHER_GASHRA = 28730, + NPC_WATCHER_SILTHIK = 28731, NPC_SKITTERING_SWARMER = 28735, NPC_SKITTERING_INFECTIOR = 28736, NPC_KRIKTHIR_THE_GATEWATCHER = 28684, diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index daa36c3066..f3f9396ba0 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -84,7 +84,7 @@ public: struct boss_hadronoxAI : public BossAI { - boss_hadronoxAI(Creature* creature) : BossAI(creature, DATA_HADRONOX_EVENT) + boss_hadronoxAI(Creature* creature) : BossAI(creature, DATA_HADRONOX) { } @@ -99,7 +99,7 @@ public: { if (param == ACTION_START_EVENT) { - instance->SetBossState(DATA_HADRONOX_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); me->setActive(true); events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20s); events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40s); @@ -342,7 +342,7 @@ public: PreventDefaultAction(); Unit* owner = GetUnitOwner(); if (InstanceScript* instance = owner->GetInstanceScript()) - if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE) + if (!instance->IsBossDone(DATA_HADRONOX)) { if (!owner->HasAura(SPELL_WEB_FRONT_DOORS)) owner->CastSpell(owner, _spellEntry, true); 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 c32f6490c2..36fd31ff13 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 @@ -29,24 +29,8 @@ enum Spells SPELL_FRENZY = 28747 }; -enum Events -{ - EVENT_KRIK_START_WAVE = 1, - EVENT_KRIK_SUMMON = 2, - EVENT_KRIK_MIND_FLAY = 3, - EVENT_KRIK_CURSE = 4, - EVENT_KRIK_HEALTH_CHECK = 5, - EVENT_KRIK_ENTER_COMBAT = 6, - EVENT_KILL_TALK = 7, - EVENT_CALL_ADDS = 8, - EVENT_KRIK_CHECK_EVADE = 9 -}; - enum Npcs { - NPC_WATCHER_NARJIL = 28729, - NPC_WATCHER_GASHRA = 28730, - NPC_WATCHER_SILTHIK = 28731, NPC_WARRIOR = 28732, NPC_SKIRMISHER = 28734, NPC_SHADOWCASTER = 28733 @@ -62,6 +46,12 @@ enum Yells SAY_SEND_GROUP = 5 }; +enum MiscActions +{ + ACTION_MINION_ENGAGED = 1, + GROUP_SWARM = 1 +}; + class boss_krik_thir : public CreatureScript { public: @@ -69,18 +59,21 @@ public: struct boss_krik_thirAI : public BossAI { - boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT) + boss_krik_thirAI(Creature* creature) : BossAI(creature, DATA_KRIKTHIR) { _initTalk = false; - } + _canTalk = true; + _minionInCombat = false; - EventMap events2; - bool _initTalk; + scheduler.SetValidator([this] + { + return !me->HasUnitState(UNIT_STATE_CASTING); + }); + } void Reset() override { BossAI::Reset(); - events2.Reset(); me->SummonCreature(NPC_WATCHER_NARJIL, 511.8f, 666.493f, 776.278f, 0.977f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); me->SummonCreature(NPC_SHADOWCASTER, 511.63f, 672.44f, 775.71f, 0.90f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); @@ -91,6 +84,22 @@ public: me->SummonCreature(NPC_WATCHER_SILTHIK, 543.826f, 665.123f, 776.245f, 1.55f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); me->SummonCreature(NPC_SKIRMISHER, 547.5f, 669.96f, 776.1f, 2.3f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); me->SummonCreature(NPC_SHADOWCASTER, 548.64f, 664.27f, 776.74f, 1.77f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30000); + + ScheduleHealthCheckEvent(25, [&] { + DoCastSelf(SPELL_FRENZY, true); + + scheduler.CancelGroup(GROUP_SWARM); + + scheduler.Schedule(7s, 17s, GROUP_SWARM, [&](TaskContext context) + { + Talk(SAY_SWARM); + DoCastAOE(SPELL_SWARM); + context.Repeat(20s); + }); + }); + + _canTalk = true; + _minionInCombat = false; } void MoveInLineOfSight(Unit* who) override @@ -103,21 +112,25 @@ public: _initTalk = true; Talk(SAY_PREFIGHT); } + } - if (events.Empty() && who->GetPositionZ() < 785.0f) + void DoAction(int32 actionId) override + { + if (actionId == ACTION_MINION_ENGAGED && !_minionInCombat) { - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 10s); - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 40s); - events2.ScheduleEvent(EVENT_KRIK_START_WAVE, 70s); - events2.ScheduleEvent(EVENT_KRIK_ENTER_COMBAT, 100s); - events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5s); - - events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1s); - events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13s); - events.ScheduleEvent(EVENT_KRIK_SUMMON, 17s); - events.ScheduleEvent(EVENT_KRIK_CURSE, 8s); - events.ScheduleEvent(EVENT_CALL_ADDS, 1s); - me->setActive(true); + _minionInCombat = true; + + for (Seconds const& timer : { 10s, 40s, 70s }) + { + me->m_Events.AddEventAtOffset([this] { + me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); + Talk(SAY_SEND_GROUP); + }, timer); + } + + me->m_Events.AddEventAtOffset([this] { + me->SetInCombatWithZone(); + }, 100s); } } @@ -132,7 +145,28 @@ public: { BossAI::JustEngagedWith(who); Talk(SAY_AGGRO); - events2.Reset(); + + me->m_Events.KillAllEvents(false); + + scheduler.Schedule(8s, 14s, [&](TaskContext context) + { + DoCastVictim(SPELL_MIND_FLAY); + if (!IsInFrenzy()) + context.Repeat(8s, 14s); + else + context.Repeat(5s, 9s); + }).Schedule(10s, 13s, GROUP_SWARM, [&](TaskContext context) + { + Talk(SAY_SWARM); + DoCastAOE(SPELL_SWARM); + context.Repeat(26s, 30s); + }); + + ScheduleTimedEvent(27s, 35s, [&] { + DoCastRandomTarget(SPELL_CURSE_OF_FATIGUE); + }, 27s, 35s); + + summons.DoZoneInCombat(); } void JustDied(Unit* killer) override @@ -141,12 +175,15 @@ public: Talk(SAY_DEATH); } - void KilledUnit(Unit* ) override + void KilledUnit(Unit* /*victim*/) override { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + if (_canTalk) { + _canTalk = false; Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); + me->m_Events.AddEventAtOffset([&] { + _canTalk = true; + }, 6s); } } @@ -161,66 +198,12 @@ public: summons.Despawn(summon); } - void UpdateAI(uint32 diff) override - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_KRIK_START_WAVE: - me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true); - Talk(SAY_SEND_GROUP); - break; - case EVENT_KRIK_ENTER_COMBAT: - me->SetInCombatWithZone(); - break; - case EVENT_KRIK_CHECK_EVADE: - if (!SelectTargetFromPlayerList(100.0f)) - { - EnterEvadeMode(); - return; - } - events2.ScheduleEvent(EVENT_KRIK_CHECK_EVADE, 5s); - break; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_KRIK_HEALTH_CHECK: - if (HealthBelowPct(10)) - { - me->CastSpell(me, SPELL_FRENZY, true); - break; - } - events.ScheduleEvent(EVENT_KRIK_HEALTH_CHECK, 1s); - break; - case EVENT_KRIK_SUMMON: - Talk(SAY_SWARM); - me->CastSpell(me, SPELL_SWARM, false); - events.ScheduleEvent(EVENT_KRIK_SUMMON, 20s); - break; - case EVENT_KRIK_MIND_FLAY: - me->CastSpell(me->GetVictim(), SPELL_MIND_FLAY, false); - events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 15s); - break; - case EVENT_KRIK_CURSE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - me->CastSpell(target, SPELL_CURSE_OF_FATIGUE, true); - events.ScheduleEvent(EVENT_KRIK_CURSE, 10s); - break; - case EVENT_CALL_ADDS: - summons.DoZoneInCombat(); - break; - } + private: + bool _initTalk; + bool _canTalk; + bool _minionInCombat; - DoMeleeAttackIfReady(); - } + [[nodiscard]] bool IsInFrenzy() const { return me->HasAura(SPELL_FRENZY); } }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 9de3f63be9..3ee2f91f98 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -25,7 +25,7 @@ DoorData const doorData[] = { - { GO_KRIKTHIR_DOORS, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DOOR_TYPE_PASSAGE }, + { GO_KRIKTHIR_DOORS, DATA_KRIKTHIR, DOOR_TYPE_PASSAGE }, { GO_ANUBARAK_DOORS1, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, { GO_ANUBARAK_DOORS2, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, { GO_ANUBARAK_DOORS3, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM }, @@ -34,15 +34,25 @@ DoorData const doorData[] = ObjectData const creatureData[] = { - { NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT }, - { NPC_HADRONOX, DATA_HADRONOX_EVENT }, - { 0, 0 } + { NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR }, + { NPC_HADRONOX, DATA_HADRONOX }, + { 0, 0 } +}; + +ObjectData const summonData[] = +{ + { NPC_SKITTERING_SWARMER, DATA_KRIKTHIR }, + { NPC_SKITTERING_INFECTIOR, DATA_KRIKTHIR }, + { NPC_ANUB_AR_CHAMPION, DATA_HADRONOX }, + { NPC_ANUB_AR_NECROMANCER, DATA_HADRONOX }, + { NPC_ANUB_AR_CRYPTFIEND, DATA_HADRONOX }, + { 0, 0 } }; BossBoundaryData const boundaries = { - { DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) }, - { DATA_HADRONOX_EVENT, new ZRangeBoundary(666.0f, 776.0f) }, + { DATA_KRIKTHIR, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) }, + { DATA_HADRONOX, new ZRangeBoundary(666.0f, 776.0f) }, { DATA_ANUBARAK_EVENT, new CircleBoundary(Position(550.6178f, 253.5917f), 26.0f) } }; @@ -60,52 +70,14 @@ public: LoadBossBoundaries(boundaries); LoadDoorData(doorData); LoadObjectData(creatureData, nullptr); + LoadSummonData(summonData); }; - void OnCreatureCreate(Creature* creature) override - { - switch (creature->GetEntry()) - { - case NPC_SKITTERING_SWARMER: - case NPC_SKITTERING_INFECTIOR: - if (Creature* krikthir = GetCreature((DATA_KRIKTHIR_THE_GATEWATCHER_EVENT))) - krikthir->AI()->JustSummoned(creature); - break; - case NPC_ANUB_AR_CHAMPION: - case NPC_ANUB_AR_NECROMANCER: - case NPC_ANUB_AR_CRYPTFIEND: - if (Creature* hadronox = GetCreature(DATA_HADRONOX_EVENT)) - hadronox->AI()->JustSummoned(creature); - break; - } - - InstanceScript::OnCreatureCreate(creature); - } - - void OnGameObjectCreate(GameObject* go) override - { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOORS: - case GO_ANUBARAK_DOORS1: - case GO_ANUBARAK_DOORS2: - case GO_ANUBARAK_DOORS3: - AddDoor(go); - break; - } - } - - void OnGameObjectRemove(GameObject* go) override + void OnCreatureEvade(Creature* creature) override { - switch (go->GetEntry()) - { - case GO_KRIKTHIR_DOORS: - case GO_ANUBARAK_DOORS1: - case GO_ANUBARAK_DOORS2: - case GO_ANUBARAK_DOORS3: - RemoveDoor(go); - break; - } + if (creature->EntryEquals(NPC_WATCHER_NARJIL, NPC_WATCHER_GASHRA, NPC_WATCHER_SILTHIK)) + if (Creature* krikthir = GetCreature(DATA_KRIKTHIR)) + krikthir->AI()->EnterEvadeMode(); } }; -- cgit v1.2.3