mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/SH: Update scripts to new register model (#26678)
(cherry picked from commit db1ec411cc)
This commit is contained in:
@@ -60,118 +60,107 @@ Position const PosSummonBrood[7] =
|
||||
{ -81.70527f, 280.8776f, 44.58830f, 0.526849f }
|
||||
};
|
||||
|
||||
class boss_anzu : public CreatureScript
|
||||
struct boss_anzu : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_anzu() : CreatureScript("boss_anzu") { }
|
||||
boss_anzu(Creature* creature) : BossAI(creature, DATA_ANZU)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
struct boss_anzuAI : public BossAI
|
||||
void Initialize()
|
||||
{
|
||||
_under33Percent = false;
|
||||
_under66Percent = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
//_Reset();
|
||||
events.Reset();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 14s);
|
||||
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*killer*/, uint32 &damage) override
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(33, damage) && !_under33Percent)
|
||||
{
|
||||
boss_anzuAI(Creature* creature) : BossAI(creature, DATA_ANZU)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_under33Percent = false;
|
||||
_under66Percent = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
//_Reset();
|
||||
events.Reset();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 14s);
|
||||
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*killer*/, uint32 &damage) override
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(33, damage) && !_under33Percent)
|
||||
{
|
||||
_under33Percent = true;
|
||||
Talk(SAY_SUMMON_BROOD);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 3s);
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(66, damage) && !_under66Percent)
|
||||
{
|
||||
_under66Percent = true;
|
||||
Talk(SAY_SUMMON_BROOD);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 3s);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PARALYZING_SCREECH:
|
||||
DoCastVictim(SPELL_PARALYZING_SCREECH);
|
||||
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 25s);
|
||||
break;
|
||||
case EVENT_CYCLONE_OF_FEATHERS:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_CYCLONE_OF_FEATHERS);
|
||||
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21s);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
// TODO: Add pathing for Brood of Anzu
|
||||
for (uint8 i = 0; i < 7; i++)
|
||||
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s);
|
||||
|
||||
DoCast(me, SPELL_BANISH_SELF);
|
||||
events.ScheduleEvent(EVENT_SPELL_BOMB, 12s);
|
||||
break;
|
||||
case EVENT_SPELL_BOMB:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
{
|
||||
if (target->GetPowerType() == POWER_MANA)
|
||||
{
|
||||
DoCast(target, SPELL_SPELL_BOMB);
|
||||
Talk(SAY_SPELL_BOMB, target);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _under33Percent;
|
||||
bool _under66Percent;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetSethekkHallsAI<boss_anzuAI>(creature);
|
||||
_under33Percent = true;
|
||||
Talk(SAY_SUMMON_BROOD);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 3s);
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(66, damage) && !_under66Percent)
|
||||
{
|
||||
_under66Percent = true;
|
||||
Talk(SAY_SUMMON_BROOD);
|
||||
events.ScheduleEvent(EVENT_SUMMON, 3s);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PARALYZING_SCREECH:
|
||||
DoCastVictim(SPELL_PARALYZING_SCREECH);
|
||||
events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 25s);
|
||||
break;
|
||||
case EVENT_CYCLONE_OF_FEATHERS:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_CYCLONE_OF_FEATHERS);
|
||||
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21s);
|
||||
break;
|
||||
case EVENT_SUMMON:
|
||||
// TODO: Add pathing for Brood of Anzu
|
||||
for (uint8 i = 0; i < 7; i++)
|
||||
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s);
|
||||
|
||||
DoCast(me, SPELL_BANISH_SELF);
|
||||
events.ScheduleEvent(EVENT_SPELL_BOMB, 12s);
|
||||
break;
|
||||
case EVENT_SPELL_BOMB:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
{
|
||||
if (target->GetPowerType() == POWER_MANA)
|
||||
{
|
||||
DoCast(target, SPELL_SPELL_BOMB);
|
||||
Talk(SAY_SPELL_BOMB, target);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _under33Percent;
|
||||
bool _under66Percent;
|
||||
};
|
||||
|
||||
void AddSC_boss_anzu()
|
||||
{
|
||||
new boss_anzu();
|
||||
RegisterSethekkHallsCreatureAI(boss_anzu);
|
||||
}
|
||||
|
||||
@@ -69,147 +69,136 @@ enum Lakka
|
||||
SAY_LAKKA_FREE = 1
|
||||
};
|
||||
|
||||
class boss_darkweaver_syth : public CreatureScript
|
||||
struct boss_darkweaver_syth : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_darkweaver_syth() : CreatureScript("boss_darkweaver_syth") { }
|
||||
|
||||
struct boss_darkweaver_sythAI : public BossAI
|
||||
boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH)
|
||||
{
|
||||
boss_darkweaver_sythAI(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH)
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_summon90 = false;
|
||||
_summon50 = false;
|
||||
_summon10 = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, 2s);
|
||||
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4s);
|
||||
events.ScheduleEvent(EVENT_FROST_SHOCK, 6s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8s);
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15s);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* lakka = me->FindNearestCreature(NPC_LAKKA, 500.0f, true))
|
||||
lakka->AI()->Talk(SAY_LAKKA_FREE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
summoned->AI()->AttackStart(target);
|
||||
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(90, damage) && !_summon90)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon90 = true;
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(50, damage) && !_summon50)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon50 = true;
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(10, damage) && !_summon10)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon10 = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SythSummoning()
|
||||
{
|
||||
Talk(SAY_SUMMON);
|
||||
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front
|
||||
DoCast(me, SPELL_SUMMON_SYTH_FIRE, true); //back
|
||||
DoCast(me, SPELL_SUMMON_SYTH_FROST, true); //left
|
||||
DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FLAME_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FLAME_SHOCK);
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_ARCANE_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_ARCANE_SHOCK);
|
||||
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_FROST_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FROST_SHOCK);
|
||||
events.ScheduleEvent(EVENT_FROST_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_SHADOW_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_SHADOW_SHOCK);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_CHAIN_LIGHTNING:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_CHAIN_LIGHTNING);
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _summon90;
|
||||
bool _summon50;
|
||||
bool _summon10;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetSethekkHallsAI<boss_darkweaver_sythAI>(creature);
|
||||
Initialize();
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
_summon90 = false;
|
||||
_summon50 = false;
|
||||
_summon10 = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
Initialize();
|
||||
_Reset();
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, 2s);
|
||||
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4s);
|
||||
events.ScheduleEvent(EVENT_FROST_SHOCK, 6s);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8s);
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15s);
|
||||
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (Creature* lakka = me->FindNearestCreature(NPC_LAKKA, 500.0f, true))
|
||||
lakka->AI()->Talk(SAY_LAKKA_FREE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
{
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
summoned->AI()->AttackStart(target);
|
||||
|
||||
summons.Summon(summoned);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
|
||||
{
|
||||
if (me->HealthBelowPctDamaged(90, damage) && !_summon90)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon90 = true;
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(50, damage) && !_summon50)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon50 = true;
|
||||
}
|
||||
|
||||
if (me->HealthBelowPctDamaged(10, damage) && !_summon10)
|
||||
{
|
||||
SythSummoning();
|
||||
_summon10 = true;
|
||||
}
|
||||
}
|
||||
|
||||
void SythSummoning()
|
||||
{
|
||||
Talk(SAY_SUMMON);
|
||||
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
|
||||
DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front
|
||||
DoCast(me, SPELL_SUMMON_SYTH_FIRE, true); //back
|
||||
DoCast(me, SPELL_SUMMON_SYTH_FROST, true); //left
|
||||
DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FLAME_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FLAME_SHOCK);
|
||||
events.ScheduleEvent(EVENT_FLAME_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_ARCANE_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_ARCANE_SHOCK);
|
||||
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_FROST_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_FROST_SHOCK);
|
||||
events.ScheduleEvent(EVENT_FROST_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_SHADOW_SHOCK:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_SHADOW_SHOCK);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
|
||||
break;
|
||||
case EVENT_CHAIN_LIGHTNING:
|
||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||
DoCast(target, SPELL_CHAIN_LIGHTNING);
|
||||
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25s);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool _summon90;
|
||||
bool _summon50;
|
||||
bool _summon10;
|
||||
};
|
||||
|
||||
void AddSC_boss_darkweaver_syth()
|
||||
{
|
||||
new boss_darkweaver_syth();
|
||||
RegisterSethekkHallsCreatureAI(boss_darkweaver_syth);
|
||||
}
|
||||
|
||||
@@ -50,163 +50,141 @@ enum Events
|
||||
EVENT_ARCANE_EXPLOSION
|
||||
};
|
||||
|
||||
class boss_talon_king_ikiss : public CreatureScript
|
||||
struct boss_talon_king_ikiss : public BossAI
|
||||
{
|
||||
public:
|
||||
boss_talon_king_ikiss() : CreatureScript("boss_talon_king_ikiss") { }
|
||||
|
||||
struct boss_talon_king_ikissAI : public BossAI
|
||||
boss_talon_king_ikiss(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS)
|
||||
{
|
||||
boss_talon_king_ikissAI(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS)
|
||||
{
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!Intro && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
|
||||
{
|
||||
Intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 5s);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 8s);
|
||||
events.ScheduleEvent(EVENT_BLINK, 35s);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SLOW, 15s, 30s);
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_POLYMORPH:
|
||||
// Second top aggro in normal, random target in heroic.
|
||||
if (IsHeroic())
|
||||
DoCast(SelectTarget(SelectTargetMethod::Random, 0), SPELL_POLYMORPH);
|
||||
else
|
||||
DoCast(SelectTarget(SelectTargetMethod::MaxThreat, 1), SPELL_POLYMORPH);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 15s, 17500ms);
|
||||
break;
|
||||
case EVENT_ARCANE_VOLLEY:
|
||||
DoCast(me, SPELL_ARCANE_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 7s, 12s);
|
||||
break;
|
||||
case EVENT_SLOW:
|
||||
DoCast(me, SPELL_SLOW);
|
||||
events.ScheduleEvent(EVENT_SLOW, 15s, 40s);
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(EMOTE_ARCANE_EXPLOSION);
|
||||
DoCastAOE(SPELL_BLINK);
|
||||
events.ScheduleEvent(EVENT_BLINK, 35s, 40s);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 1s);
|
||||
break;
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
DoCast(me, SPELL_ARCANE_EXPLOSION);
|
||||
DoCast(me, SPELL_ARCANE_BUBBLE, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*who*/, uint32& damage) override
|
||||
{
|
||||
if (!ManaShield && me->HealthBelowPctDamaged(20, damage))
|
||||
{
|
||||
DoCast(me, SPELL_MANA_SHIELD);
|
||||
ManaShield = true;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
private:
|
||||
bool ManaShield;
|
||||
bool Intro;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const override
|
||||
{
|
||||
return GetSethekkHallsAI<boss_talon_king_ikissAI>(creature);
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void Reset() override
|
||||
{
|
||||
_Reset();
|
||||
Intro = false;
|
||||
ManaShield = false;
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* who) override
|
||||
{
|
||||
if (!Intro && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
|
||||
{
|
||||
Intro = true;
|
||||
Talk(SAY_INTRO);
|
||||
}
|
||||
|
||||
BossAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustEngagedWith(Unit* who) override
|
||||
{
|
||||
BossAI::JustEngagedWith(who);
|
||||
Talk(SAY_AGGRO);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 5s);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 8s);
|
||||
events.ScheduleEvent(EVENT_BLINK, 35s);
|
||||
if (IsHeroic())
|
||||
events.ScheduleEvent(EVENT_SLOW, 15s, 30s);
|
||||
}
|
||||
|
||||
void ExecuteEvent(uint32 eventId) override
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_POLYMORPH:
|
||||
// Second top aggro in normal, random target in heroic.
|
||||
if (IsHeroic())
|
||||
DoCast(SelectTarget(SelectTargetMethod::Random, 0), SPELL_POLYMORPH);
|
||||
else
|
||||
DoCast(SelectTarget(SelectTargetMethod::MaxThreat, 1), SPELL_POLYMORPH);
|
||||
events.ScheduleEvent(EVENT_POLYMORPH, 15s, 17500ms);
|
||||
break;
|
||||
case EVENT_ARCANE_VOLLEY:
|
||||
DoCast(me, SPELL_ARCANE_VOLLEY);
|
||||
events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 7s, 12s);
|
||||
break;
|
||||
case EVENT_SLOW:
|
||||
DoCast(me, SPELL_SLOW);
|
||||
events.ScheduleEvent(EVENT_SLOW, 15s, 40s);
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
if (me->IsNonMeleeSpellCast(false))
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
Talk(EMOTE_ARCANE_EXPLOSION);
|
||||
DoCastAOE(SPELL_BLINK);
|
||||
events.ScheduleEvent(EVENT_BLINK, 35s, 40s);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 1s);
|
||||
break;
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
DoCast(me, SPELL_ARCANE_EXPLOSION);
|
||||
DoCast(me, SPELL_ARCANE_BUBBLE, true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*who*/, uint32& damage) override
|
||||
{
|
||||
if (!ManaShield && me->HealthBelowPctDamaged(20, damage))
|
||||
{
|
||||
DoCast(me, SPELL_MANA_SHIELD);
|
||||
ManaShield = true;
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
{
|
||||
_JustDied();
|
||||
Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
private:
|
||||
bool ManaShield;
|
||||
bool Intro;
|
||||
};
|
||||
|
||||
// 38194 - Blink
|
||||
class spell_talon_king_ikiss_blink : public SpellScriptLoader
|
||||
class spell_talon_king_ikiss_blink : public SpellScript
|
||||
{
|
||||
public:
|
||||
spell_talon_king_ikiss_blink() : SpellScriptLoader("spell_talon_king_ikiss_blink") { }
|
||||
PrepareSpellScript(spell_talon_king_ikiss_blink);
|
||||
|
||||
class spell_talon_king_ikiss_blink_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_talon_king_ikiss_blink_SpellScript);
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_BLINK_TELEPORT });
|
||||
}
|
||||
|
||||
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||
{
|
||||
return ValidateSpellInfo({ SPELL_BLINK_TELEPORT });
|
||||
}
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
if (targets.empty())
|
||||
return;
|
||||
|
||||
void FilterTargets(std::list<WorldObject*>& targets)
|
||||
{
|
||||
if (targets.empty())
|
||||
return;
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
targets.clear();
|
||||
targets.push_back(target);
|
||||
}
|
||||
|
||||
WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
|
||||
targets.clear();
|
||||
targets.push_back(target);
|
||||
}
|
||||
void HandleDummyHitTarget(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetCaster(), SPELL_BLINK_TELEPORT, true);
|
||||
}
|
||||
|
||||
void HandleDummyHitTarget(SpellEffIndex effIndex)
|
||||
{
|
||||
PreventHitDefaultEffect(effIndex);
|
||||
GetHitUnit()->CastSpell(GetCaster(), SPELL_BLINK_TELEPORT, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_talon_king_ikiss_blink_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_talon_king_ikiss_blink_SpellScript::HandleDummyHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript* GetSpellScript() const override
|
||||
{
|
||||
return new spell_talon_king_ikiss_blink_SpellScript();
|
||||
}
|
||||
void Register() override
|
||||
{
|
||||
OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_talon_king_ikiss_blink::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
|
||||
OnEffectHitTarget += SpellEffectFn(spell_talon_king_ikiss_blink::HandleDummyHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_talon_king_ikiss()
|
||||
{
|
||||
new boss_talon_king_ikiss();
|
||||
new spell_talon_king_ikiss_blink();
|
||||
RegisterSethekkHallsCreatureAI(boss_talon_king_ikiss);
|
||||
RegisterSpellScript(spell_talon_king_ikiss_blink);
|
||||
}
|
||||
|
||||
@@ -54,4 +54,6 @@ inline AI* GetSethekkHallsAI(T* obj)
|
||||
return GetInstanceAI<AI>(obj, SHScriptName);
|
||||
}
|
||||
|
||||
#define RegisterSethekkHallsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetSethekkHallsAI)
|
||||
|
||||
#endif // SETHEKK_HALLS_H_
|
||||
|
||||
Reference in New Issue
Block a user