mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 03:45:43 +00:00
fix(Scripts/TheBotanica): Rework Commander Sarannis (#15264)
Co-authored-by: offl <11556157+offl@users.noreply.github.com>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user