fix(Scripts/TheBotanica): Rework Commander Sarannis (#15264)
Co-authored-by: offl <11556157+offl@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,8 @@
|
|||||||
|
--
|
||||||
|
DELETE FROM `spell_script_names` WHERE `spell_id` = 34799 AND `ScriptName` = 'spell_commander_sarannis_arcane_devastation';
|
||||||
|
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
|
||||||
|
(34799,'spell_commander_sarannis_arcane_devastation');
|
||||||
|
|
||||||
|
UPDATE `spell_dbc` SET `Effect_1` = 28, `EffectMiscValueB_1` = 64 WHERE `ID` IN (34810, 34817, 34818, 34819);
|
||||||
|
|
||||||
|
UPDATE `creature_addon` SET `auras` = '34792 19818' WHERE `guid` IN (SELECT `guid` FROM `creature` WHERE `id1` = 17976);
|
||||||
@@ -35,142 +35,139 @@ enum Spells
|
|||||||
{
|
{
|
||||||
SPELL_ARCANE_RESONANCE = 34794,
|
SPELL_ARCANE_RESONANCE = 34794,
|
||||||
SPELL_ARCANE_DEVASTATION = 34799,
|
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,
|
boss_commander_sarannis(Creature* creature) : BossAI(creature, DATA_COMMANDER_SARANNIS), _summoned(false) { }
|
||||||
EVENT_ARCANE_DEVASTATION = 2,
|
|
||||||
EVENT_HEALTH_CHECK = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
class boss_commander_sarannis : public CreatureScript
|
void Reset() override
|
||||||
{
|
|
||||||
public:
|
|
||||||
boss_commander_sarannis() : CreatureScript("boss_commander_sarannis") { }
|
|
||||||
|
|
||||||
struct boss_commander_sarannisAI : public BossAI
|
|
||||||
{
|
{
|
||||||
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_KILL);
|
||||||
Talk(SAY_AGGRO);
|
|
||||||
events.ScheduleEvent(EVENT_ARCANE_RESONANCE, 20000);
|
|
||||||
events.ScheduleEvent(EVENT_ARCANE_DEVASTATION, 10000);
|
|
||||||
events.ScheduleEvent(EVENT_HEALTH_CHECK, 500);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
_summoned = true;
|
||||||
Talk(SAY_KILL);
|
ScheduleReinforcements();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
void ScheduleReinforcements()
|
||||||
|
{
|
||||||
|
scheduler.Schedule(IsHeroic() ? 1min : 1s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
_JustDied();
|
Talk(EMOTE_SUMMON);
|
||||||
Talk(SAY_DEATH);
|
Talk(SAY_SUMMON);
|
||||||
}
|
DoCast(SPELL_SUMMON_REINFORCEMENTS);
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
if (IsHeroic())
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_ARCANE_RESONANCE:
|
context.Repeat();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
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] =
|
// 34803 - Summon Reinforcements
|
||||||
{
|
class spell_commander_sarannis_summon_reinforcements : public SpellScript
|
||||||
{ 160.4483f, 287.6435f, -3.887904f, 2.3841f },
|
{
|
||||||
{ 153.4406f, 289.9929f, -4.736916f, 2.3841f },
|
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements);
|
||||||
{ 154.4137f, 292.8956f, -4.683603f, 2.3841f },
|
|
||||||
{ 157.1544f, 294.2599f, -4.726504f, 2.3841f }
|
|
||||||
};
|
|
||||||
|
|
||||||
enum Creatures
|
bool Validate(SpellInfo const* /*spellInfo*/) override
|
||||||
{
|
{
|
||||||
NPC_SUMMONED_BLOODWARDER_MENDER = 20083,
|
return ValidateSpellInfo({ SPELL_SUMMON_MENDER_1, SPELL_SUMMON_RESERVIST_1, SPELL_SUMMON_RESERVIST_2, SPELL_SUMMON_RESERVIST_3 });
|
||||||
NPC_SUMMONED_BLOODWARDER_RESERVIST = 20078
|
}
|
||||||
};
|
|
||||||
|
|
||||||
class spell_commander_sarannis_summon_reinforcements : public SpellScriptLoader
|
void HandleCast(SpellEffIndex /*effIndex*/)
|
||||||
{
|
{
|
||||||
public:
|
std::vector<uint32> reinforcementSpells = { SPELL_SUMMON_MENDER_1, SPELL_SUMMON_RESERVIST_1, SPELL_SUMMON_RESERVIST_2, SPELL_SUMMON_RESERVIST_3 };
|
||||||
spell_commander_sarannis_summon_reinforcements() : SpellScriptLoader("spell_commander_sarannis_summon_reinforcements") { }
|
for (uint32 spellId : reinforcementSpells)
|
||||||
|
{
|
||||||
|
GetCaster()->CastSpell((Unit*)nullptr, spellId, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class spell_commander_sarannis_summon_reinforcements_SpellScript : public SpellScript
|
void Register() override
|
||||||
{
|
{
|
||||||
PrepareSpellScript(spell_commander_sarannis_summon_reinforcements_SpellScript);
|
OnEffectHitTarget += SpellEffectFn(spell_commander_sarannis_summon_reinforcements::HandleCast, EFFECT_0, SPELL_EFFECT_DUMMY);
|
||||||
|
}
|
||||||
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 AddSC_boss_commander_sarannis()
|
void AddSC_boss_commander_sarannis()
|
||||||
{
|
{
|
||||||
new boss_commander_sarannis();
|
RegisterTheBotanicaCreatureAI(boss_commander_sarannis);
|
||||||
new spell_commander_sarannis_summon_reinforcements();
|
RegisterSpellScript(spell_commander_sarannis_arcane_devastation);
|
||||||
|
RegisterSpellScript(spell_commander_sarannis_summon_reinforcements);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user