diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-12-01 02:49:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-01 02:49:26 +0200 |
commit | be00563a8675c22826c38ce85079eff719a95f09 (patch) | |
tree | 31b0533e91b22d157fdc33323f8ab4b959b72b59 | |
parent | 2779fb602f75226389c9b4caf1744c97d0591b83 (diff) |
Scripts/Mechanar: Rework Nethermancer Sepethrea (#27277)
-rw-r--r-- | sql/updates/world/3.3.5/2021_12_01_01_world.sql | 15 | ||||
-rw-r--r-- | src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp | 212 |
2 files changed, 130 insertions, 97 deletions
diff --git a/sql/updates/world/3.3.5/2021_12_01_01_world.sql b/sql/updates/world/3.3.5/2021_12_01_01_world.sql new file mode 100644 index 00000000000..c112ccf0b03 --- /dev/null +++ b/sql/updates/world/3.3.5/2021_12_01_01_world.sql @@ -0,0 +1,15 @@ +-- +DELETE FROM `spell_script_names` WHERE `spell_id` IN (35268,39346) AND `ScriptName` = 'spell_nethermancer_sepethrea_inferno'; +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(35268,'spell_nethermancer_sepethrea_inferno'), +(39346,'spell_nethermancer_sepethrea_inferno'); + +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId` = 13 AND `SourceEntry` = 35277; +INSERT INTO `conditions` (`SourceTypeOrReferenceId`,`SourceGroup`,`SourceEntry`,`SourceId`,`ElseGroup`,`ConditionTypeOrReference`,`ConditionTarget`,`ConditionValue1`,`ConditionValue2`,`ConditionValue3`,`NegativeCondition`,`ErrorType`,`ErrorTextId`,`ScriptName`,`Comment`) VALUES +(13,1,35277,0,0,31,0,3,20481,0,0,0,0,"","Group 0: Spell 'Quell Raging Flames' (Effect 0) targets creature 'Raging Flames'"); + +-- They're not immune even to fire, only to all mechanics +UPDATE `creature_template` SET `ScriptName` = 'npc_raging_flames' WHERE `entry` = 20481; +UPDATE `creature_template` SET `mechanic_immune_mask` = 617299803, `spell_school_immune_mask` = 0 WHERE `entry` IN (20481,21538); + +UPDATE `spell_dbc` SET `ProcFlags` = 20, `ProcChance` = 100, `BaseLevel` = 70, `SpellLevel` = 70, `Effect1` = 6, `EffectImplicitTargetA1` = 1, `EffectApplyAuraName1` = 42, `EffectTriggerSpell1` = 45195, `DmgClass` = 1, `PreventionType` = 1, `DmgMultiplier1` = 1, `DmgMultiplier2` = 1 WHERE `Id` = 45196; diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 4d6b5fc06a5..11d8153367a 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -15,23 +15,18 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Nethermancer_Sepethrea -SD%Complete: 90 -SDComment: Need adjustments to initial summons -SDCategory: Tempest Keep, The Mechanar -EndScriptData */ - #include "ScriptMgr.h" #include "InstanceScript.h" +#include "ObjectAccessor.h" #include "mechanar.h" -#include "MotionMaster.h" #include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" -enum Says +enum Texts { SAY_AGGRO = 0, - SAY_SUMMON = 1, + SAY_SUMMON = 1, // Was never used or used under unknown conditions SAY_DRAGONS_BREATH = 2, SAY_SLAY = 3, SAY_DEATH = 4 @@ -39,53 +34,73 @@ enum Says enum Spells { - SPELL_SUMMON_RAGIN_FLAMES = 35275, // Not scripted - SPELL_FROST_ATTACK = 35263, + SPELL_FROST_ATTACK = 45196, // This is definitely spell added in TBC but did it replaced both 35264 and 39086 or only normal version? + SPELL_SUMMON_RAGING_FLAMES = 35275, + SPELL_QUELL_RAGING_FLAMES = 35277, SPELL_ARCANE_BLAST = 35314, SPELL_DRAGONS_BREATH = 35250, - SPELL_KNOCKBACK = 37317, - SPELL_SOLARBURN = 35267, - H_SPELL_SUMMON_RAGIN_FLAMES = 39084, // Not scripted - SPELL_INFERNO = 35268, // Not scripted - H_SPELL_INFERNO = 39346, // Not scripted - SPELL_FIRE_TAIL = 35278 // Not scripted + + // Raging Flames + SPELL_RAGING_FLAMES_DUMMY = 35274, // NYI, no clue what it can do + SPELL_RAGING_FLAMES_AREA_AURA = 35281, + SPELL_INVIS_STEALTH_DETECTION = 18950, // For some reason every time it's used by summoned creatures, it's applied after random delay. Ignored + SPELL_INFERNO = 35268, + SPELL_INFERNO_DAMAGE = 35283 }; enum Events { - EVENT_FROST_ATTACK = 1, - EVENT_ARCANE_BLAST = 2, - EVENT_DRAGONS_BREATH = 3, - EVENT_KNOCKBACK = 4, - EVENT_SOLARBURN = 5 + EVENT_ARCANE_BLAST = 1, + EVENT_DRAGONS_BREATH }; struct boss_nethermancer_sepethrea : public BossAI { boss_nethermancer_sepethrea(Creature* creature) : BossAI(creature, DATA_NETHERMANCER_SEPRETHREA) { } + void Reset() override + { + DoCastSelf(SPELL_FROST_ATTACK); + me->SetCombatPulseDelay(0); + events.Reset(); + instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, NOT_STARTED); + } + void JustEngagedWith(Unit* who) override { BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_FROST_ATTACK, 7s, 10s); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 12s, 18s); - events.ScheduleEvent(EVENT_DRAGONS_BREATH, 18s, 22s); - events.ScheduleEvent(EVENT_KNOCKBACK, 22s, 28s); - events.ScheduleEvent(EVENT_SOLARBURN, 30s); + events.ScheduleEvent(EVENT_ARCANE_BLAST, 15s, 25s); + events.ScheduleEvent(EVENT_DRAGONS_BREATH, 20s, 30s); Talk(SAY_AGGRO); - DoCast(who, SPELL_SUMMON_RAGIN_FLAMES); - Talk(SAY_SUMMON); + DoCastSelf(SPELL_SUMMON_RAGING_FLAMES); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void EnterEvadeMode(EvadeReason why) override + { + // Fails because target is in evade mode (yes, she kills them on evade too) + DoCastSelf(SPELL_QUELL_RAGING_FLAMES, true); + summons.DespawnAll(); + ScriptedAI::EnterEvadeMode(why); } - void KilledUnit(Unit* /*victim*/) override + void JustReachedHome() override { - Talk(SAY_SLAY); + _JustReachedHome(); + DoCastSelf(SPELL_FROST_ATTACK); } void JustDied(Unit* /*killer*/) override { - _JustDied(); + events.Reset(); + instance->SetBossState(DATA_NETHERMANCER_SEPRETHREA, DONE); Talk(SAY_DEATH); + DoCastSelf(SPELL_QUELL_RAGING_FLAMES, true); } void UpdateAI(uint32 diff) override @@ -102,28 +117,18 @@ struct boss_nethermancer_sepethrea : public BossAI { switch (eventId) { - case EVENT_FROST_ATTACK: - DoCastVictim(SPELL_FROST_ATTACK, true); - events.ScheduleEvent(EVENT_FROST_ATTACK, 7s, 10s); - break; case EVENT_ARCANE_BLAST: - DoCastVictim(SPELL_ARCANE_BLAST, true); - events.ScheduleEvent(EVENT_ARCANE_BLAST, 15s); + DoCastVictim(SPELL_ARCANE_BLAST); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -50); + events.Repeat(15s, 25s); break; case EVENT_DRAGONS_BREATH: - DoCastVictim(SPELL_DRAGONS_BREATH, true); - events.ScheduleEvent(EVENT_DRAGONS_BREATH, 12s, 22s); + DoCastSelf(SPELL_DRAGONS_BREATH); + events.Repeat(25s, 35s); if (roll_chance_i(50)) Talk(SAY_DRAGONS_BREATH); break; - case EVENT_KNOCKBACK: - DoCastVictim(SPELL_KNOCKBACK, true); - events.ScheduleEvent(EVENT_KNOCKBACK, 15s, 25s); - break; - case EVENT_SOLARBURN: - DoCastVictim(SPELL_SOLARBURN, true); - events.ScheduleEvent(EVENT_SOLARBURN, 30s); - break; default: break; } @@ -136,81 +141,94 @@ struct boss_nethermancer_sepethrea : public BossAI } }; -struct npc_ragin_flames : public ScriptedAI +struct npc_raging_flames : public ScriptedAI { - npc_ragin_flames(Creature* creature) : ScriptedAI(creature) + npc_raging_flames(Creature* creature) : ScriptedAI(creature) { } + + void InitializeAI() override { - Initialize(); - instance = creature->GetInstanceScript(); + me->SetCorpseDelay(20, true); } - void Initialize() + void IsSummonedBy(WorldObject* summoner) override { - inferno_Timer = 10000; - flame_timer = 500; - Check_Timer = 2000; - onlyonce = false; + _summonerGUID = summoner->GetGUID(); } - InstanceScript* instance; - - uint32 inferno_Timer; - uint32 flame_timer; - uint32 Check_Timer; + // It's more tricky actually + void FixateRandomTarget() + { + ResetThreatList(); - bool onlyonce; + if (Creature* _summoner = ObjectAccessor::GetCreature(*me, _summonerGUID)) + if (_summoner->IsAIEnabled()) + if (Unit* target = _summoner->AI()->SelectTarget(SelectTargetMethod::Random, 1, 100.0f, true, false)) + AddThreat(target, 1000000.0f); + } - void Reset() override + void JustAppeared() override { - Initialize(); + DoZoneInCombat(); + DoCastSelf(SPELL_RAGING_FLAMES_AREA_AURA); + DoCastSelf(SPELL_INVIS_STEALTH_DETECTION); + + FixateRandomTarget(); + + _scheduler.Schedule(15s, 25s, [this](TaskContext task) + { + DoCastSelf(SPELL_INFERNO); + FixateRandomTarget(); + + task.Repeat(20s, 30s); + }); } - void JustEngagedWith(Unit* /*who*/) override + void Reset() override { + _scheduler.CancelAll(); } void UpdateAI(uint32 diff) override { - //Check_Timer - if (Check_Timer <= diff) - { - if (instance->GetBossState(DATA_NETHERMANCER_SEPRETHREA) != IN_PROGRESS) - { - //remove - me->DespawnOrUnsummon(); - return; - } - Check_Timer = 1000; - } else Check_Timer -= diff; - if (!UpdateVictim()) return; - if (!onlyonce) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->GetMotionMaster()->MoveChase(target); - onlyonce = true; - } + _scheduler.Update(diff); - if (inferno_Timer <= diff) - { - DoCastVictim(SPELL_INFERNO); - inferno_Timer = 10000; - } else inferno_Timer -= diff; + DoMeleeAttackIfReady(); + } - if (flame_timer <= diff) - { - DoCast(me, SPELL_FIRE_TAIL); - flame_timer = 500; - } else flame_timer -=diff; +private: + TaskScheduler _scheduler; + ObjectGuid _summonerGUID; +}; - DoMeleeAttackIfReady(); +// 35268, 39346 - Inferno +class spell_nethermancer_sepethrea_inferno : public AuraScript +{ + PrepareAuraScript(spell_nethermancer_sepethrea_inferno); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_INFERNO_DAMAGE }); + } + + void HandlePeriodic(AuraEffect const* aurEff) + { + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(aurEff->GetAmount()); + GetTarget()->CastSpell(GetTarget(), SPELL_INFERNO_DAMAGE, args); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_nethermancer_sepethrea_inferno::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; void AddSC_boss_nethermancer_sepethrea() { RegisterMechanarCreatureAI(boss_nethermancer_sepethrea); - RegisterMechanarCreatureAI(npc_ragin_flames); + RegisterMechanarCreatureAI(npc_raging_flames); + RegisterSpellScript(spell_nethermancer_sepethrea_inferno); } |