Scripts/SH: Update scripts to new register model (#26678)

This commit is contained in:
offl
2021-07-13 05:16:16 +03:00
committed by GitHub
parent 4bca9c990d
commit db1ec411cc
4 changed files with 343 additions and 385 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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_