fix(Scripts/AzjolNerub): Modernize Krikthir the Gatewatcher script (#22647)
Co-authored-by: sudlud <sudlud@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
-- Remove heroic casts as it is already handled by spelldifficulty_dbc and add on aggro engage
|
||||||
|
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28729);
|
||||||
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||||
|
(28729, 0, 0, 0, 0, 0, 100, 0, 2000, 6000, 15000, 20000, 0, 0, 11, 52524, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - In Combat - Cast \'Blinding Webs\''),
|
||||||
|
(28729, 0, 2, 0, 0, 0, 100, 0, 6000, 15000, 20000, 25000, 0, 0, 11, 52086, 0, 0, 0, 0, 0, 5, 30, 0, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - In Combat - Cast \'Web Wrap\''),
|
||||||
|
(28729, 0, 3, 0, 0, 0, 100, 0, 4000, 12000, 9000, 15000, 0, 0, 11, 52469, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - In Combat - Cast \'Infected Bite\''),
|
||||||
|
(28729, 0, 5, 0, 8, 0, 100, 0, 52343, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - On Spellhit \'Krik`Thir Subboss Aggro Trigger\' - Set In Combat With Zone'),
|
||||||
|
(28729, 0, 6, 0, 0, 0, 100, 1, 500, 500, 0, 0, 0, 0, 39, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - In Combat - Call For Help (No Repeat)'),
|
||||||
|
(28729, 0, 1, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 205, 0, 1, 0, 0, 0, 0, 0, 0, 'Watcher Narjil - On Aggro - Do Action ID 1');
|
||||||
|
|
||||||
|
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28730);
|
||||||
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||||
|
(28730, 0, 0, 0, 0, 0, 100, 0, 2000, 6000, 15000, 20000, 0, 0, 11, 52470, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - In Combat - Cast \'Enrage\''),
|
||||||
|
(28730, 0, 1, 0, 0, 0, 100, 0, 6000, 15000, 20000, 25000, 0, 0, 11, 52086, 0, 0, 0, 0, 0, 5, 30, 0, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - In Combat - Cast \'Web Wrap\''),
|
||||||
|
(28730, 0, 2, 0, 0, 0, 100, 0, 4000, 12000, 9000, 15000, 0, 0, 11, 52469, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - In Combat - Cast \'Infected Bite\''),
|
||||||
|
(28730, 0, 4, 0, 8, 0, 100, 0, 52343, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - On Spellhit \'Krik`Thir Subboss Aggro Trigger\' - Set In Combat With Zone'),
|
||||||
|
(28730, 0, 5, 0, 0, 0, 100, 1, 500, 500, 0, 0, 0, 0, 39, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - In Combat - Call For Help (No Repeat)'),
|
||||||
|
(28730, 0, 3, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 205, 0, 1, 0, 0, 0, 0, 0, 0, 'Watcher Gashra - On Aggro - Do Action ID 1');
|
||||||
|
|
||||||
|
DELETE FROM `smart_scripts` WHERE (`source_type` = 0 AND `entryorguid` = 28731);
|
||||||
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param6`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||||
|
(28731, 0, 0, 0, 0, 0, 100, 0, 2000, 6000, 15000, 20000, 0, 0, 11, 52493, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - In Combat - Cast \'Poison Spray\''),
|
||||||
|
(28731, 0, 2, 0, 0, 0, 100, 0, 6000, 15000, 20000, 25000, 0, 0, 11, 52086, 0, 0, 0, 0, 0, 5, 30, 0, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - In Combat - Cast \'Web Wrap\''),
|
||||||
|
(28731, 0, 3, 0, 0, 0, 100, 0, 4000, 12000, 9000, 15000, 0, 0, 11, 52469, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - In Combat - Cast \'Infected Bite\''),
|
||||||
|
(28731, 0, 5, 0, 8, 0, 100, 0, 52343, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - On Spellhit \'Krik`Thir Subboss Aggro Trigger\' - Set In Combat With Zone'),
|
||||||
|
(28731, 0, 6, 0, 0, 0, 100, 1, 500, 500, 0, 0, 0, 0, 39, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - In Combat - Call For Help (No Repeat)'),
|
||||||
|
(28731, 0, 1, 0, 4, 0, 100, 0, 0, 0, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 0, 205, 0, 1, 0, 0, 0, 0, 0, 0, 'Watcher Silthik - On Aggro - Do Action ID 1');
|
||||||
|
|
||||||
|
UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask` &~ 33554432 WHERE `entry` IN (28684, 31612);
|
||||||
@@ -26,14 +26,17 @@
|
|||||||
|
|
||||||
enum ANData
|
enum ANData
|
||||||
{
|
{
|
||||||
DATA_KRIKTHIR_THE_GATEWATCHER_EVENT = 0,
|
DATA_KRIKTHIR = 0,
|
||||||
DATA_HADRONOX_EVENT = 1,
|
DATA_HADRONOX = 1,
|
||||||
DATA_ANUBARAK_EVENT = 2,
|
DATA_ANUBARAK_EVENT = 2,
|
||||||
MAX_ENCOUNTERS = 3
|
MAX_ENCOUNTERS = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ANIds
|
enum ANIds
|
||||||
{
|
{
|
||||||
|
NPC_WATCHER_NARJIL = 28729,
|
||||||
|
NPC_WATCHER_GASHRA = 28730,
|
||||||
|
NPC_WATCHER_SILTHIK = 28731,
|
||||||
NPC_SKITTERING_SWARMER = 28735,
|
NPC_SKITTERING_SWARMER = 28735,
|
||||||
NPC_SKITTERING_INFECTIOR = 28736,
|
NPC_SKITTERING_INFECTIOR = 28736,
|
||||||
NPC_KRIKTHIR_THE_GATEWATCHER = 28684,
|
NPC_KRIKTHIR_THE_GATEWATCHER = 28684,
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public:
|
|||||||
|
|
||||||
struct boss_hadronoxAI : public BossAI
|
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)
|
if (param == ACTION_START_EVENT)
|
||||||
{
|
{
|
||||||
instance->SetBossState(DATA_HADRONOX_EVENT, IN_PROGRESS);
|
instance->SetBossState(DATA_HADRONOX, IN_PROGRESS);
|
||||||
me->setActive(true);
|
me->setActive(true);
|
||||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20s);
|
events.ScheduleEvent(EVENT_HADRONOX_MOVE1, 20s);
|
||||||
events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40s);
|
events.ScheduleEvent(EVENT_HADRONOX_MOVE2, 40s);
|
||||||
@@ -342,7 +342,7 @@ public:
|
|||||||
PreventDefaultAction();
|
PreventDefaultAction();
|
||||||
Unit* owner = GetUnitOwner();
|
Unit* owner = GetUnitOwner();
|
||||||
if (InstanceScript* instance = owner->GetInstanceScript())
|
if (InstanceScript* instance = owner->GetInstanceScript())
|
||||||
if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE)
|
if (!instance->IsBossDone(DATA_HADRONOX))
|
||||||
{
|
{
|
||||||
if (!owner->HasAura(SPELL_WEB_FRONT_DOORS))
|
if (!owner->HasAura(SPELL_WEB_FRONT_DOORS))
|
||||||
owner->CastSpell(owner, _spellEntry, true);
|
owner->CastSpell(owner, _spellEntry, true);
|
||||||
|
|||||||
+79
-96
@@ -29,24 +29,8 @@ enum Spells
|
|||||||
SPELL_FRENZY = 28747
|
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
|
enum Npcs
|
||||||
{
|
{
|
||||||
NPC_WATCHER_NARJIL = 28729,
|
|
||||||
NPC_WATCHER_GASHRA = 28730,
|
|
||||||
NPC_WATCHER_SILTHIK = 28731,
|
|
||||||
NPC_WARRIOR = 28732,
|
NPC_WARRIOR = 28732,
|
||||||
NPC_SKIRMISHER = 28734,
|
NPC_SKIRMISHER = 28734,
|
||||||
NPC_SHADOWCASTER = 28733
|
NPC_SHADOWCASTER = 28733
|
||||||
@@ -62,6 +46,12 @@ enum Yells
|
|||||||
SAY_SEND_GROUP = 5
|
SAY_SEND_GROUP = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum MiscActions
|
||||||
|
{
|
||||||
|
ACTION_MINION_ENGAGED = 1,
|
||||||
|
GROUP_SWARM = 1
|
||||||
|
};
|
||||||
|
|
||||||
class boss_krik_thir : public CreatureScript
|
class boss_krik_thir : public CreatureScript
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -69,18 +59,21 @@ public:
|
|||||||
|
|
||||||
struct boss_krik_thirAI : public BossAI
|
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;
|
_initTalk = false;
|
||||||
}
|
_canTalk = true;
|
||||||
|
_minionInCombat = false;
|
||||||
|
|
||||||
EventMap events2;
|
scheduler.SetValidator([this]
|
||||||
bool _initTalk;
|
{
|
||||||
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
BossAI::Reset();
|
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_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);
|
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_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_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);
|
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
|
void MoveInLineOfSight(Unit* who) override
|
||||||
@@ -103,21 +112,25 @@ public:
|
|||||||
_initTalk = true;
|
_initTalk = true;
|
||||||
Talk(SAY_PREFIGHT);
|
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);
|
_minionInCombat = true;
|
||||||
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);
|
for (Seconds const& timer : { 10s, 40s, 70s })
|
||||||
events.ScheduleEvent(EVENT_KRIK_MIND_FLAY, 13s);
|
{
|
||||||
events.ScheduleEvent(EVENT_KRIK_SUMMON, 17s);
|
me->m_Events.AddEventAtOffset([this] {
|
||||||
events.ScheduleEvent(EVENT_KRIK_CURSE, 8s);
|
me->CastCustomSpell(SPELL_SUBBOSS_AGGRO_TRIGGER, SPELLVALUE_MAX_TARGETS, 1, me, true);
|
||||||
events.ScheduleEvent(EVENT_CALL_ADDS, 1s);
|
Talk(SAY_SEND_GROUP);
|
||||||
me->setActive(true);
|
}, timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
me->m_Events.AddEventAtOffset([this] {
|
||||||
|
me->SetInCombatWithZone();
|
||||||
|
}, 100s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +145,28 @@ public:
|
|||||||
{
|
{
|
||||||
BossAI::JustEngagedWith(who);
|
BossAI::JustEngagedWith(who);
|
||||||
Talk(SAY_AGGRO);
|
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
|
void JustDied(Unit* killer) override
|
||||||
@@ -141,12 +175,15 @@ public:
|
|||||||
Talk(SAY_DEATH);
|
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);
|
Talk(SAY_SLAY);
|
||||||
events.ScheduleEvent(EVENT_KILL_TALK, 6s);
|
me->m_Events.AddEventAtOffset([&] {
|
||||||
|
_canTalk = true;
|
||||||
|
}, 6s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,66 +198,12 @@ public:
|
|||||||
summons.Despawn(summon);
|
summons.Despawn(summon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
private:
|
||||||
{
|
bool _initTalk;
|
||||||
events2.Update(diff);
|
bool _canTalk;
|
||||||
switch (events2.ExecuteEvent())
|
bool _minionInCombat;
|
||||||
{
|
|
||||||
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())
|
[[nodiscard]] bool IsInFrenzy() const { return me->HasAura(SPELL_FRENZY); }
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
CreatureAI* GetAI(Creature* creature) const override
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
DoorData const doorData[] =
|
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_DOORS1, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
||||||
{ GO_ANUBARAK_DOORS2, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
{ GO_ANUBARAK_DOORS2, DATA_ANUBARAK_EVENT, DOOR_TYPE_ROOM },
|
||||||
{ GO_ANUBARAK_DOORS3, 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[] =
|
ObjectData const creatureData[] =
|
||||||
{
|
{
|
||||||
{ NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR_THE_GATEWATCHER_EVENT },
|
{ NPC_KRIKTHIR_THE_GATEWATCHER, DATA_KRIKTHIR },
|
||||||
{ NPC_HADRONOX, DATA_HADRONOX_EVENT },
|
{ NPC_HADRONOX, DATA_HADRONOX },
|
||||||
{ 0, 0 }
|
{ 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 =
|
BossBoundaryData const boundaries =
|
||||||
{
|
{
|
||||||
{ DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) },
|
{ DATA_KRIKTHIR, new RectangleBoundary(400.0f, 580.0f, 623.5f, 810.0f) },
|
||||||
{ DATA_HADRONOX_EVENT, new ZRangeBoundary(666.0f, 776.0f) },
|
{ DATA_HADRONOX, new ZRangeBoundary(666.0f, 776.0f) },
|
||||||
{ DATA_ANUBARAK_EVENT, new CircleBoundary(Position(550.6178f, 253.5917f), 26.0f) }
|
{ DATA_ANUBARAK_EVENT, new CircleBoundary(Position(550.6178f, 253.5917f), 26.0f) }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -60,52 +70,14 @@ public:
|
|||||||
LoadBossBoundaries(boundaries);
|
LoadBossBoundaries(boundaries);
|
||||||
LoadDoorData(doorData);
|
LoadDoorData(doorData);
|
||||||
LoadObjectData(creatureData, nullptr);
|
LoadObjectData(creatureData, nullptr);
|
||||||
|
LoadSummonData(summonData);
|
||||||
};
|
};
|
||||||
|
|
||||||
void OnCreatureCreate(Creature* creature) override
|
void OnCreatureEvade(Creature* creature) override
|
||||||
{
|
{
|
||||||
switch (creature->GetEntry())
|
if (creature->EntryEquals(NPC_WATCHER_NARJIL, NPC_WATCHER_GASHRA, NPC_WATCHER_SILTHIK))
|
||||||
{
|
if (Creature* krikthir = GetCreature(DATA_KRIKTHIR))
|
||||||
case NPC_SKITTERING_SWARMER:
|
krikthir->AI()->EnterEvadeMode();
|
||||||
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
|
|
||||||
{
|
|
||||||
switch (go->GetEntry())
|
|
||||||
{
|
|
||||||
case GO_KRIKTHIR_DOORS:
|
|
||||||
case GO_ANUBARAK_DOORS1:
|
|
||||||
case GO_ANUBARAK_DOORS2:
|
|
||||||
case GO_ANUBARAK_DOORS3:
|
|
||||||
RemoveDoor(go);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user