fix(Scripts/TheBotanica): Rework Commander Sarannis (#15264)

Co-authored-by: offl <11556157+offl@users.noreply.github.com>
This commit is contained in:
Skjalf
2023-03-04 17:23:58 -03:00
committed by GitHub
parent 12e69248f8
commit b546c6829e
2 changed files with 112 additions and 107 deletions

View File

@@ -35,142 +35,139 @@ enum Spells
{
SPELL_ARCANE_RESONANCE = 34794,
SPELL_ARCANE_DEVASTATION = 34799,
SPELL_SUMMON_REINFORCEMENTS = 34803
SPELL_SUMMON_REINFORCEMENTS = 34803,
SPELL_SUMMON_MENDER_1 = 34810,
SPELL_SUMMON_RESERVIST_1 = 34817,
SPELL_SUMMON_RESERVIST_2 = 34818,
SPELL_SUMMON_RESERVIST_3 = 34819
};
enum Events
struct boss_commander_sarannis : public BossAI
{
EVENT_ARCANE_RESONANCE = 1,
EVENT_ARCANE_DEVASTATION = 2,
EVENT_HEALTH_CHECK = 3
};
boss_commander_sarannis(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS), _summoned(false) { }
class boss_commander_sarannis : public CreatureScript
{
public:
boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
struct boss_commander_sarannisAI : public BossAI
void Reset() override
{
boss_commander_sarannisAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS) { }
_Reset();
_summoned = false;
}
void Reset() override
void JustEngagedWith(Unit* /*who*/) override
{
_JustEngagedWith();
Talk(SAY_AGGRO);
scheduler.Schedule(20s, [this](TaskContext context)
{
_Reset();
if (roll_chance_i(50))
Talk(SAY_ARCANE_RESONANCE);
DoCastVictim(SPELL_ARCANE_RESONANCE);
context.Repeat(27s);
}).Schedule(10s, [this](TaskContext context)
{
if (roll_chance_i(50))
Talk(SAY_ARCANE_DEVASTATION);
DoCastVictim(SPELL_ARCANE_DEVASTATION);
context.Repeat(17s);
});
if (IsHeroic())
{
ScheduleReinforcements();
}
}
void JustEngagedWith(Unit* /*who*/) override
void KilledUnit(Unit* victim) override
{
if (victim->IsPlayer())
{
_JustEngagedWith();
Talk(SAY_AGGRO);
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000);
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000);
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
Talk(SAY_KILL);
}
}
void KilledUnit(Unit* victim) override
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
}
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/) override
{
if (!_summoned && me->HealthBelowPctDamaged(55, damage) && !IsHeroic())
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_KILL);
_summoned = true;
ScheduleReinforcements();
}
}
void JustDied(Unit* /*killer*/) override
void ScheduleReinforcements()
{
scheduler.Schedule(IsHeroic() ? 1min : 1s, [this](TaskContext context)
{
_JustDied();
Talk(SAY_DEATH);
}
Talk(EMOTE_SUMMON);
Talk(SAY_SUMMON);
DoCast(SPELL_SUMMON_REINFORCEMENTS);
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
if (IsHeroic())
{
case EVENT_ARCANE_RESONANCE:
if (roll_chance_i(50))
Talk(SAY_ARCANE_RESONANCE);
me->CastSpell(me->GetVictim(), SPELL_ARCANE_RESONANCE, false);
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 27000);
break;
case EVENT_ARCANE_DEVASTATION:
if (roll_chance_i(50))
Talk(SAY_ARCANE_DEVASTATION);
me->CastSpell(me->GetVictim(), SPELL_ARCANE_DEVASTATION, false);
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 17000);
break;
case EVENT_HEALTH_CHECK:
if (me->HealthBelowPct(50))
{
Talk(EMOTE_SUMMON);
Talk(SAY_SUMMON);
me->CastSpell(me, SPELL_SUMMON_REINFORCEMENTS, true);
break;
}
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
break;
context.Repeat();
}
});
}
DoMeleeAttackIfReady();
}
};
private:
bool _summoned;
};
CreatureAI* GetAI(Creature* creature) const override
// 34799 - Arcane Devastation
class spell_commander_sarannis_arcane_devastation : public AuraScript
{
PrepareAuraScript(spell_commander_sarannis_arcane_devastation);
bool Validate(SpellInfo const* /*spell*/) override
{
return GetTheBotanicaAI<boss_commander_sarannisAI>(creature);
return ValidateSpellInfo({ SPELL_ARCANE_RESONANCE });
}
void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->RemoveAurasDueToSpell(SPELL_ARCANE_RESONANCE);
}
void Register() override
{
AfterEffectApply += AuraEffectApplyFn(spell_commander_sarannis_arcane_devastation::AfterApply, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
}
};
Position const PosSummonReinforcements[4] =
{
{ 160.4483f, 287.6435f, -3.887904f, 2.3841f },
{ 153.4406f, 289.9929f, -4.736916f, 2.3841f },
{ 154.4137f, 292.8956f, -4.683603f, 2.3841f },
{ 157.1544f, 294.2599f, -4.726504f, 2.3841f }
};
// 34803 - Summon Reinforcements
class spell_commander_sarannis_summon_reinforcements : public SpellScript
{
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements);
enum Creatures
{
NPC_SUMMONED_BLOODWARDER_MENDER = 20083,
NPC_SUMMONED_BLOODWARDER_RESERVIST = 20078
};
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_SUMMON_MENDER_1, SPELL_SUMMON_RESERVIST_1, SPELL_SUMMON_RESERVIST_2, SPELL_SUMMON_RESERVIST_3 });
}
class spell_commander_sarannis_summon_reinforcements : public SpellScriptLoader
{
public:
spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { }
void HandleCast(SpellEffIndex /*effIndex*/)
{
std::vector<uint32> reinforcementSpells = { SPELL_SUMMON_MENDER_1, SPELL_SUMMON_RESERVIST_1, SPELL_SUMMON_RESERVIST_2, SPELL_SUMMON_RESERVIST_3 };
for (uint32 spellId : reinforcementSpells)
{
GetCaster()->CastSpell((Unit*)nullptr, spellId, true);
}
}
class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript
{
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript);
void HandleCast(SpellEffIndex /*effIndex*/)
{
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_MENDER, PosSummonReinforcements[0], TEMPSUMMON_CORPSE_DESPAWN);
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[1], TEMPSUMMON_CORPSE_DESPAWN);
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[2], TEMPSUMMON_CORPSE_DESPAWN);
if (GetCaster()->GetMap()->IsHeroic())
GetCaster()->SummonCreature(NPC_SUMMONED_BLOODWARDER_RESERVIST, PosSummonReinforcements[3], TEMPSUMMON_CORPSE_DESPAWN);
}
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements_SpellScript::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_commander_sarannis_summon_reinforcements_SpellScript();
}
};
void Register() override
{
OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
}
};
void AddSC_boss_commander_sarannis()
{
new boss_commander_sarannis();
new spell_commander_sarannis_summon_reinforcements();
RegisterTheBotanicaCreatureAI(boss_commander_sarannis);
RegisterSpellScript(spell_commander_sarannis_arcane_devastation);
RegisterSpellScript(spell_commander_sarannis_summon_reinforcements);
}