diff --git a/data/sql/updates/pending_db_world/rev_1677959284674069900.sql b/data/sql/updates/pending_db_world/rev_1677959284674069900.sql new file mode 100644 index 000000000..5598e220b --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1677959284674069900.sql @@ -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); diff --git a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp index 34a885db2..84d8ed7a9 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/boss_commander_sarannis.cpp @@ -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(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 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); }