aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-06-10 15:09:54 +0300
committerGitHub <noreply@github.com>2025-06-10 14:09:54 +0200
commit539f6e4ff446bbcbee1eb46531f288452eafd19f (patch)
treed8aac3310a89d0f0fefe0ae2a522824810db241b /src
parentdde454198a9cb8f43edbb9ef36a54aabd318c711 (diff)
Scripts/Mana Tombs: Update scripts (#31024)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp216
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp74
-rw-r--r--src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp51
3 files changed, 179 insertions, 162 deletions
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
index c42902b6085..0c0202d9e11 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp
@@ -15,80 +15,74 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_NexusPrince_Shaffar
-SD%Complete: 80
-SDComment: Need more tuning of spell timers, it should not be as linear fight as current. Also should possibly find a better way to deal with his three initial beacons to make sure all aggro.
-SDCategory: Auchindoun, Mana Tombs
-EndScriptData */
+/*
+ * Timers requires to be revisited
+ * Find a better way to deal with his three initial beacons to make sure all aggro
+ * His caster mode requires rechecks
+ * Move away after succesful Frost Nova cast (seems like doesn't always triggered)
+ */
#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellInfo.h"
#include "mana_tombs.h"
#include "MotionMaster.h"
-#include "ScriptedCreature.h"
-enum Yells
+enum ShaffarTexts
{
SAY_INTRO = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
SAY_SUMMON = 3,
- SAY_DEAD = 4
+ SAY_DEATH = 4
};
-enum Spells
+enum ShaffarSpells
{
+ // Shaffar
SPELL_BLINK = 34605,
- SPELL_FROSTBOLT = 32364,
SPELL_FIREBALL = 32363,
+ SPELL_FROSTBOLT = 32364,
SPELL_FROSTNOVA = 32365,
- SPELL_ETHEREAL_BEACON = 32371, // Summons NPC_BEACON
- SPELL_ETHEREAL_BEACON_VISUAL = 32368,
+ SPELL_ETHEREAL_BEACON = 32371,
// Ethereal Beacon
+ SPELL_ETHEREAL_BEACON_VISUAL = 32368,
SPELL_ARCANE_BOLT = 15254,
- SPELL_ETHEREAL_APPRENTICE = 32372 // Summon 18430
+ SPELL_ETHEREAL_APPRENTICE = 32372
};
-enum Creatures
+enum ShaffarEvents
{
- NPC_BEACON = 18431,
- NPC_SHAFFAR = 18344
-};
+ EVENT_BLINK = 1,
+ EVENT_BEACON,
+ EVENT_MAIN_SPELL,
+ EVENT_FROST_NOVA,
-enum Misc
-{
- NR_INITIAL_BEACONS = 3
+ // Ethereal Beacon
+ EVENT_SUMMON_APPRENTICE,
+ EVENT_ARCANE_BOLT
};
-enum Events
+enum ShaffarCreatures
{
- EVENT_BLINK = 1,
- EVENT_BEACON,
- EVENT_FIREBALL,
- EVENT_FROSTBOLT,
- EVENT_FROST_NOVA
+ NPC_BEACON = 18431,
+ NPC_SHAFFAR = 18344
};
+// 18344 - Nexus-Prince Shaffar
struct boss_nexusprince_shaffar : public BossAI
{
- boss_nexusprince_shaffar(Creature* creature) : BossAI(creature, DATA_NEXUSPRINCE_SHAFFAR)
- {
- _hasTaunted = false;
- }
+ boss_nexusprince_shaffar(Creature* creature) : BossAI(creature, DATA_NEXUSPRINCE_SHAFFAR), _hasTaunted(false) { }
void Reset() override
{
_Reset();
- float dist = 8.0f;
- float posX, posY, posZ, angle;
- me->GetHomePosition(posX, posY, posZ, angle);
-
- me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h);
- me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h);
- me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h);
+ me->SummonCreature(NPC_BEACON, -191.116f, 3.82914f, 16.7834f, 3.62003f, TEMPSUMMON_MANUAL_DESPAWN);
+ me->SummonCreature(NPC_BEACON, -180.408f, 10.9629f, 16.7025f, 3.45070f, TEMPSUMMON_MANUAL_DESPAWN);
+ me->SummonCreature(NPC_BEACON, -185.980f, 14.4201f, 16.7234f, 1.31540f, TEMPSUMMON_MANUAL_DESPAWN);
}
void MoveInLineOfSight(Unit* who) override
@@ -105,25 +99,33 @@ struct boss_nexusprince_shaffar : public BossAI
Talk(SAY_AGGRO);
BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_BEACON, 10s);
- events.ScheduleEvent(EVENT_FIREBALL, 8s);
- events.ScheduleEvent(EVENT_FROSTBOLT, 4s);
- events.ScheduleEvent(EVENT_FROST_NOVA, 15s);
+ events.ScheduleEvent(EVENT_BLINK, 20s, 30s);
+ events.ScheduleEvent(EVENT_BEACON, 10s, 30s);
+ events.ScheduleEvent(EVENT_MAIN_SPELL, 0s, 6s);
+ events.ScheduleEvent(EVENT_FROST_NOVA, 15s, 35s);
}
void JustSummoned(Creature* summoned) override
{
if (summoned->GetEntry() == NPC_BEACON)
{
- summoned->CastSpell(summoned, SPELL_ETHEREAL_BEACON_VISUAL, false);
-
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
summoned->AI()->AttackStart(target);
+
+ if (!me->IsInCombat())
+ summoned->GetMotionMaster()->MoveRandom(5.0f);
}
summons.Summon(summoned);
}
+ void OnSpellCast(SpellInfo const* spell) override
+ {
+ if (spell->Id == SPELL_ETHEREAL_BEACON)
+ if (roll_chance_i(50))
+ Talk(SAY_SUMMON);
+ }
+
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
@@ -132,7 +134,7 @@ struct boss_nexusprince_shaffar : public BossAI
void JustDied(Unit* /*killer*/) override
{
- Talk(SAY_DEAD);
+ Talk(SAY_DEATH);
_JustDied();
}
@@ -141,34 +143,25 @@ struct boss_nexusprince_shaffar : public BossAI
switch (eventId)
{
case EVENT_BLINK:
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
-
- // expire movement, will prevent from running right back to victim after cast
- // (but should MoveChase be used again at a certain time or should he not move?)
- me->GetMotionMaster()->Clear(MOTION_PRIORITY_NORMAL);
-
- DoCast(me, SPELL_BLINK);
+ DoCastSelf(SPELL_BLINK);
+ events.Repeat(40s, 60s);
+ events.RescheduleEvent(EVENT_MAIN_SPELL, 0s);
break;
case EVENT_BEACON:
- if (!urand(0, 3))
- Talk(SAY_SUMMON);
-
- DoCast(me, SPELL_ETHEREAL_BEACON, true);
- events.ScheduleEvent(EVENT_BEACON, 10s);
+ DoCastSelf(SPELL_ETHEREAL_BEACON);
+ events.Repeat(20s);
break;
- case EVENT_FIREBALL:
- DoCastVictim(SPELL_FROSTBOLT);
- events.ScheduleEvent(EVENT_FIREBALL, 4500ms, 6s);
- break;
- case EVENT_FROSTBOLT:
- DoCastVictim(SPELL_FROSTBOLT);
- events.ScheduleEvent(EVENT_FROSTBOLT, 4500ms, 6s);
+ case EVENT_MAIN_SPELL:
+ DoCastVictim(RAND(SPELL_FIREBALL, SPELL_FROSTBOLT));
+
+ if (me->IsWithinMeleeRange(me->GetVictim()))
+ events.Repeat(1s, 6s);
+ else
+ events.Repeat(1s);
break;
case EVENT_FROST_NOVA:
- DoCast(me, SPELL_FROSTNOVA);
- events.ScheduleEvent(EVENT_FROST_NOVA, 17500ms, 25s);
- events.ScheduleEvent(EVENT_BLINK, 1500ms);
+ DoCastSelf(SPELL_FROSTNOVA);
+ events.Repeat(15s, 25s);
break;
default:
break;
@@ -179,16 +172,16 @@ private:
bool _hasTaunted;
};
-enum EtherealBeacon
-{
- EVENT_APPRENTICE = 1,
- EVENT_ARCANE_BOLT
-};
-
+// 18431 - Ethereal Beacon
struct npc_ethereal_beacon : public ScriptedAI
{
npc_ethereal_beacon(Creature* creature) : ScriptedAI(creature) { }
+ void JustAppeared() override
+ {
+ DoCastSelf(SPELL_ETHEREAL_BEACON_VISUAL);
+ }
+
void Reset() override
{
_events.Reset();
@@ -200,8 +193,8 @@ struct npc_ethereal_beacon : public ScriptedAI
if (!shaffar->IsInCombat())
shaffar->AI()->AttackStart(who);
- _events.ScheduleEvent(EVENT_APPRENTICE, DUNGEON_MODE(20s, 10s));
- _events.ScheduleEvent(EVENT_ARCANE_BOLT, 1s);
+ _events.ScheduleEvent(EVENT_SUMMON_APPRENTICE, DUNGEON_MODE(20s, 10s));
+ _events.ScheduleEvent(EVENT_ARCANE_BOLT, 3s, 10s);
}
void JustSummoned(Creature* summoned) override
@@ -223,13 +216,17 @@ struct npc_ethereal_beacon : public ScriptedAI
{
switch (eventId)
{
- case EVENT_APPRENTICE:
- DoCast(me, SPELL_ETHEREAL_APPRENTICE, true);
- me->DespawnOrUnsummon();
+ case EVENT_SUMMON_APPRENTICE:
+ DoCastSelf(SPELL_ETHEREAL_APPRENTICE);
+ me->AttackStop();
+ me->SetReactState(REACT_PASSIVE);
+ me->SetImmuneToPC(true);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ me->DespawnOrUnsummon(2s);
break;
case EVENT_ARCANE_BOLT:
DoCastVictim(SPELL_ARCANE_BOLT);
- _events.ScheduleEvent(EVENT_ARCANE_BOLT, 2s, 4500ms);
+ _events.Repeat(3s, 10s);
break;
default:
break;
@@ -243,16 +240,23 @@ private:
enum EtherealApprentice
{
+ SPELL_SIMPLE_TELEPORT = 12980,
SPELL_ETHEREAL_APPRENTICE_FIREBOLT = 32369,
SPELL_ETHEREAL_APPRENTICE_FROSTBOLT = 32370,
EVENT_ETHEREAL_APPRENTICE_FIREBOLT = 1,
EVENT_ETHEREAL_APPRENTICE_FROSTBOLT
};
+// 18430 - Ethereal Apprentice
struct npc_ethereal_apprentice : public ScriptedAI
{
npc_ethereal_apprentice(Creature* creature) : ScriptedAI(creature) { }
+ void JustAppeared() override
+ {
+ DoCastSelf(SPELL_SIMPLE_TELEPORT);
+ }
+
void Reset() override
{
_events.Reset();
@@ -260,7 +264,7 @@ struct npc_ethereal_apprentice : public ScriptedAI
void JustEngagedWith(Unit* /*who*/) override
{
- _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s);
+ _events.ScheduleEvent(RAND(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, EVENT_ETHEREAL_APPRENTICE_FROSTBOLT), 0s);
}
void UpdateAI(uint32 diff) override
@@ -278,11 +282,11 @@ struct npc_ethereal_apprentice : public ScriptedAI
switch (eventId)
{
case EVENT_ETHEREAL_APPRENTICE_FIREBOLT:
- DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FIREBOLT, true);
+ DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FIREBOLT);
_events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FROSTBOLT, 3s);
break;
case EVENT_ETHEREAL_APPRENTICE_FROSTBOLT:
- DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FROSTBOLT, true);
+ DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FROSTBOLT);
_events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s);
break;
default:
@@ -295,55 +299,9 @@ private:
EventMap _events;
};
-enum Yor
-{
- SPELL_DOUBLE_BREATH = 38361,
- EVENT_DOUBLE_BREATH = 1
-};
-
-struct npc_yor : public ScriptedAI
-{
- npc_yor(Creature* creature) : ScriptedAI(creature) { }
-
- void Reset() override { }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s);
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- _events.Update(diff);
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_DOUBLE_BREATH:
- if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE))
- DoCastVictim(SPELL_DOUBLE_BREATH);
- _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s);
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
- }
-
- private:
- EventMap _events;
-};
-
void AddSC_boss_nexusprince_shaffar()
{
RegisterManaTombsCreatureAI(boss_nexusprince_shaffar);
RegisterManaTombsCreatureAI(npc_ethereal_beacon);
RegisterManaTombsCreatureAI(npc_ethereal_apprentice);
- RegisterManaTombsCreatureAI(npc_yor);
}
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
index 7e27d248182..bd37a0de22a 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp
@@ -15,61 +15,74 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/*
+ * Timers requires to be revisited
+ * Is Dark Shell cast really delayed?
+ */
+
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellInfo.h"
+#include "SpellMgr.h"
#include "mana_tombs.h"
-enum Texts
+enum PandemoniusTexts
{
- SAY_AGGRO = 0,
- SAY_KILL = 1,
- SAY_DEATH = 2,
- EMOTE_DARK_SHELL = 3
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2,
+ EMOTE_DARK_SHELL = 3
};
-enum Spells
+enum PandemoniusSpells
{
- SPELL_VOID_BLAST = 32325,
- SPELL_DARK_SHELL = 32358
+ SPELL_VOID_BLAST = 32325,
+ SPELL_VOID_BLAST_SCRIPT = 32326, // NYI. Is it used? What it does?
+ SPELL_DARK_SHELL = 32358
};
-enum Events
+enum PandemoniusEvents
{
- EVENT_VOID_BLAST = 1,
+ EVENT_VOID_BLAST = 1,
EVENT_DARK_SHELL
};
uint32 constexpr DARK_SHELL_EVENT_GROUP = 1;
+// 18341 - Pandemonius
struct boss_pandemonius : public BossAI
{
- boss_pandemonius(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS)
- {
- VoidBlastCounter = 0;
- }
+ boss_pandemonius(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS), _voidBlastCounter(0) { }
void Reset() override
{
_Reset();
- VoidBlastCounter = 0;
+ _voidBlastCounter = 0;
}
- void JustDied(Unit* /*killer*/) override
+ void JustEngagedWith(Unit* who) override
{
- Talk(SAY_DEATH);
+ BossAI::JustEngagedWith(who);
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP);
+ events.ScheduleEvent(EVENT_VOID_BLAST, 8s, 23s);
+ }
+
+ void OnSpellStart(SpellInfo const* spell) override
+ {
+ if (spell->Id == sSpellMgr->GetSpellIdForDifficulty(SPELL_DARK_SHELL, me))
+ Talk(EMOTE_DARK_SHELL);
}
void KilledUnit(Unit* /*victim*/) override
{
- Talk(SAY_KILL);
+ Talk(SAY_SLAY);
}
- void JustEngagedWith(Unit* who) override
+ void JustDied(Unit* /*killer*/) override
{
- BossAI::JustEngagedWith(who);
- Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP);
- events.ScheduleEvent(EVENT_VOID_BLAST, 8s, 23s);
+ Talk(SAY_DEATH);
+ _JustDied();
}
void ExecuteEvent(uint32 eventId) override
@@ -80,12 +93,12 @@ struct boss_pandemonius : public BossAI
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
{
DoCast(target, SPELL_VOID_BLAST);
- ++VoidBlastCounter;
+ ++_voidBlastCounter;
}
- if (VoidBlastCounter == 5)
+ if (_voidBlastCounter == 5)
{
- VoidBlastCounter = 0;
+ _voidBlastCounter = 0;
events.ScheduleEvent(EVENT_VOID_BLAST, 15s, 25s);
}
else
@@ -95,10 +108,7 @@ struct boss_pandemonius : public BossAI
}
break;
case EVENT_DARK_SHELL:
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(true);
- Talk(EMOTE_DARK_SHELL);
- DoCast(me, SPELL_DARK_SHELL);
+ DoCastSelf(SPELL_DARK_SHELL);
events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP);
break;
default:
@@ -106,8 +116,8 @@ struct boss_pandemonius : public BossAI
}
}
- private:
- uint32 VoidBlastCounter;
+private:
+ uint32 _voidBlastCounter;
};
void AddSC_boss_pandemonius()
diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp
index c52b5a398a7..16c9acf8935 100644
--- a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.cpp
@@ -16,10 +16,58 @@
*/
#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
#include "SpellScript.h"
#include "Unit.h"
+#include "mana_tombs.h"
-enum
+enum YorSpells
+{
+ SPELL_DOUBLE_BREATH = 38361
+};
+
+// 22930 - Yor
+struct npc_yor : public ScriptedAI
+{
+ npc_yor(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustAppeared() override
+ {
+ _scheduler.Schedule(1500ms, [this](TaskContext /*task*/)
+ {
+ me->SetFaction(FACTION_MONSTER_2);
+ });
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ _scheduler.Schedule(6s, 14s, [this](TaskContext task)
+ {
+ DoCastVictim(SPELL_DOUBLE_BREATH);
+ task.Repeat(8s, 14s);
+ });
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ _scheduler.CancelAll();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+enum SummonArcaneFiends
{
SPELL_SUMMON_ARCANE_FIEND_1 = 32349,
SPELL_SUMMON_ARCANE_FIEND_2 = 32353
@@ -54,5 +102,6 @@ class spell_mana_tombs_summon_arcane_fiends : public SpellScript
void AddSC_mana_tombs()
{
+ RegisterManaTombsCreatureAI(npc_yor);
RegisterSpellScript(spell_mana_tombs_summon_arcane_fiends);
}