summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorAndrew <47818697+Nyeriah@users.noreply.github.com>2025-09-06 10:21:00 -0300
committerGitHub <noreply@github.com>2025-09-06 10:21:00 -0300
commit46f12f78e063a9a4684667269e9f032fc3a86a66 (patch)
tree90e2ebf8869e0d0c431f63d850fac6d3ab92725e /src/server
parent119af326494995eba42bbb47b79bca08ffb614b3 (diff)
fix(Scripts/AzjolNerub): Modernize Krikthir the Gatewatcher script (#22647)
Co-authored-by: sudlud <sudlud@users.noreply.github.com>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h7
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp6
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp177
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp70
4 files changed, 109 insertions, 151 deletions
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();
}
};