aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2021-12-01 02:49:26 +0200
committerGitHub <noreply@github.com>2021-12-01 02:49:26 +0200
commitbe00563a8675c22826c38ce85079eff719a95f09 (patch)
tree31b0533e91b22d157fdc33323f8ab4b959b72b59
parent2779fb602f75226389c9b4caf1744c97d0591b83 (diff)
Scripts/Mechanar: Rework Nethermancer Sepethrea (#27277)
-rw-r--r--sql/updates/world/3.3.5/2021_12_01_01_world.sql15
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp212
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);
}