fix(Scripts/BlackTemple): Move Teron Gorefiend to scheduler and add Berserk (#19288)
Update boss_teron_gorefiend.cpp
This commit is contained in:
@@ -46,6 +46,7 @@ enum Spells
|
|||||||
SPELL_POSSESS_SPIRIT_IMMUNE = 40282,
|
SPELL_POSSESS_SPIRIT_IMMUNE = 40282,
|
||||||
SPELL_SPIRITUAL_VENGEANCE = 40268,
|
SPELL_SPIRITUAL_VENGEANCE = 40268,
|
||||||
SPELL_BRIEF_STUN = 41421,
|
SPELL_BRIEF_STUN = 41421,
|
||||||
|
SPELL_BERSERK = 45078,
|
||||||
|
|
||||||
SPELL_SPIRIT_LANCE = 40157,
|
SPELL_SPIRIT_LANCE = 40157,
|
||||||
SPELL_SPIRIT_CHAINS = 40175,
|
SPELL_SPIRIT_CHAINS = 40175,
|
||||||
@@ -54,13 +55,7 @@ enum Spells
|
|||||||
|
|
||||||
enum Misc
|
enum Misc
|
||||||
{
|
{
|
||||||
SET_DATA_INTRO = 1,
|
SET_DATA_INTRO = 1
|
||||||
|
|
||||||
EVENT_SPELL_INCINERATE = 1,
|
|
||||||
EVENT_SPELL_DOOM_BLOSSOM = 2,
|
|
||||||
EVENT_SPELL_CRUSHING_SHADOWS = 3,
|
|
||||||
EVENT_SPELL_SHADOW_OF_DEATH = 4,
|
|
||||||
EVENT_TALK_KILL = 10
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ShadowOfDeathSelector
|
struct ShadowOfDeathSelector
|
||||||
@@ -73,9 +68,11 @@ struct ShadowOfDeathSelector
|
|||||||
|
|
||||||
struct boss_teron_gorefiend : public BossAI
|
struct boss_teron_gorefiend : public BossAI
|
||||||
{
|
{
|
||||||
boss_teron_gorefiend(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND), intro(false) { }
|
boss_teron_gorefiend(Creature* creature) : BossAI(creature, DATA_TERON_GOREFIEND)
|
||||||
|
{
|
||||||
bool intro;
|
_recentlySpoken = false;
|
||||||
|
_intro = false;
|
||||||
|
}
|
||||||
|
|
||||||
void Reset() override
|
void Reset() override
|
||||||
{
|
{
|
||||||
@@ -83,36 +80,72 @@ struct boss_teron_gorefiend : public BossAI
|
|||||||
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
me->CastSpell(me, SPELL_SHADOW_OF_DEATH_REMOVE, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JustEngagedWith(Unit* who) override
|
||||||
|
{
|
||||||
|
ScheduleTimedEvent(20s, 30s, [&]
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
||||||
|
{
|
||||||
|
if (roll_chance_i(50))
|
||||||
|
Talk(SAY_INCINERATE);
|
||||||
|
me->CastSpell(target, SPELL_INCINERATE, false);
|
||||||
|
}
|
||||||
|
}, 20s, 50s);
|
||||||
|
|
||||||
|
ScheduleTimedEvent(5s, 10s, [&]
|
||||||
|
{
|
||||||
|
if (roll_chance_i(50))
|
||||||
|
Talk(SAY_BLOSSOM);
|
||||||
|
me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false);
|
||||||
|
}, 35s);
|
||||||
|
|
||||||
|
ScheduleTimedEvent(17s, 22s, [&]
|
||||||
|
{
|
||||||
|
if (roll_chance_i(20))
|
||||||
|
Talk(SAY_CRUSHING);
|
||||||
|
me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
||||||
|
}, 10s, 26s);
|
||||||
|
|
||||||
|
ScheduleTimedEvent(10s, [&]
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, ShadowOfDeathSelector()))
|
||||||
|
me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false);
|
||||||
|
}, 30s, 50s);
|
||||||
|
|
||||||
|
ScheduleTimedEvent(10min, [&]
|
||||||
|
{
|
||||||
|
DoCastSelf(SPELL_BERSERK);
|
||||||
|
}, 5min);
|
||||||
|
|
||||||
|
BossAI::JustEngagedWith(who);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit* victim) override
|
||||||
|
{
|
||||||
|
if (!_recentlySpoken && victim->IsPlayer())
|
||||||
|
{
|
||||||
|
Talk(SAY_SLAY);
|
||||||
|
_recentlySpoken = true;
|
||||||
|
|
||||||
|
ScheduleUniqueTimedEvent(6s, [&]
|
||||||
|
{
|
||||||
|
_recentlySpoken = false;
|
||||||
|
}, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SetData(uint32 type, uint32 id) override
|
void SetData(uint32 type, uint32 id) override
|
||||||
{
|
{
|
||||||
if (type || !me->IsAlive())
|
if (type || !me->IsAlive())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (id == SET_DATA_INTRO && !intro)
|
if (id == SET_DATA_INTRO && !_intro)
|
||||||
{
|
{
|
||||||
intro = true;
|
_intro = true;
|
||||||
Talk(SAY_INTRO);
|
Talk(SAY_INTRO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void JustEngagedWith(Unit* who) override
|
|
||||||
{
|
|
||||||
BossAI::JustEngagedWith(who);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 24000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 10000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 17000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 20000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* /*victim*/) override
|
|
||||||
{
|
|
||||||
if (events.GetNextEventTime(EVENT_TALK_KILL) == 0)
|
|
||||||
{
|
|
||||||
Talk(SAY_SLAY);
|
|
||||||
events.ScheduleEvent(EVENT_TALK_KILL, 6000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
void JustSummoned(Creature* summon) override
|
||||||
{
|
{
|
||||||
summons.Summon(summon);
|
summons.Summon(summon);
|
||||||
@@ -130,43 +163,13 @@ struct boss_teron_gorefiend : public BossAI
|
|||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
events.Update(diff);
|
scheduler.Update(diff);
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
|
||||||
case EVENT_SPELL_INCINERATE:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
|
|
||||||
{
|
|
||||||
if (roll_chance_i(50))
|
|
||||||
Talk(SAY_INCINERATE);
|
|
||||||
me->CastSpell(target, SPELL_INCINERATE, false);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_INCINERATE, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_DOOM_BLOSSOM:
|
|
||||||
if (roll_chance_i(50))
|
|
||||||
Talk(SAY_BLOSSOM);
|
|
||||||
|
|
||||||
me->CastSpell(me, SPELL_SUMMON_DOOM_BLOSSOM, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DOOM_BLOSSOM, 40000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_CRUSHING_SHADOWS:
|
|
||||||
if (roll_chance_i(20))
|
|
||||||
Talk(SAY_CRUSHING);
|
|
||||||
me->CastCustomSpell(SPELL_CRUSHING_SHADOWS, SPELLVALUE_MAX_TARGETS, 5, me, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_CRUSHING_SHADOWS, 15000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_SHADOW_OF_DEATH:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, ShadowOfDeathSelector()))
|
|
||||||
me->CastSpell(target, SPELL_SHADOW_OF_DEATH, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_SHADOW_OF_DEATH, 30000);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
DoMeleeAttackIfReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _recentlySpoken;
|
||||||
|
bool _intro;
|
||||||
};
|
};
|
||||||
|
|
||||||
class spell_teron_gorefiend_shadow_of_death : public AuraScript
|
class spell_teron_gorefiend_shadow_of_death : public AuraScript
|
||||||
|
|||||||
Reference in New Issue
Block a user