aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/3.3.5/2025_05_17_03_world.sql4
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp67
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp175
-rw-r--r--src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp85
4 files changed, 164 insertions, 167 deletions
diff --git a/sql/updates/world/3.3.5/2025_05_17_03_world.sql b/sql/updates/world/3.3.5/2025_05_17_03_world.sql
new file mode 100644
index 00000000000..02e836d3144
--- /dev/null
+++ b/sql/updates/world/3.3.5/2025_05_17_03_world.sql
@@ -0,0 +1,4 @@
+--
+DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_darkweaver_syth_summon_elementals';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(33595, 'spell_darkweaver_syth_summon_elementals');
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
index db3559a32de..b380d9b2cbb 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_anzu.cpp
@@ -15,38 +15,37 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/*
-Name: Boss_Anzu
-%Complete: 80%
-Comment:
-Category: Auchindoun, Sethekk Halls
-*/
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "sethekk_halls.h"
-enum Says
+enum AnzuTexts
{
SAY_SUMMON_BROOD = 0,
SAY_SPELL_BOMB = 1
};
-enum Spells
+enum AnzuSpells
{
SPELL_PARALYZING_SCREECH = 40184,
SPELL_SPELL_BOMB = 40303,
SPELL_CYCLONE_OF_FEATHERS = 40321,
- SPELL_BANISH_SELF = 42354,
- SPELL_FLESH_RIP = 40199
+ SPELL_BANISH_SELF = 42354
};
-enum Events
+enum AnzuEvents
{
EVENT_PARALYZING_SCREECH = 1,
- EVENT_SPELL_BOMB = 2,
- EVENT_CYCLONE_OF_FEATHERS = 3,
- EVENT_SUMMON = 4
+ EVENT_SPELL_BOMB,
+ EVENT_CYCLONE_OF_FEATHERS,
+ EVENT_SUMMON
+};
+
+enum AnzuPhases : uint8
+{
+ PHASE_NONE = 0,
+ PHASE_HEALTH_66,
+ PHASE_HEALTH_33
};
Position const PosSummonBrood[7] =
@@ -60,24 +59,16 @@ Position const PosSummonBrood[7] =
{ -81.70527f, 280.8776f, 44.58830f, 0.526849f }
};
+// 23035 - Anzu
struct boss_anzu : public BossAI
{
- boss_anzu(Creature* creature) : BossAI(creature, DATA_ANZU)
- {
- Initialize();
- }
-
- void Initialize()
- {
- _under33Percent = false;
- _under66Percent = false;
- }
+ boss_anzu(Creature* creature) : BossAI(creature, DATA_ANZU), _phase(PHASE_NONE) { }
void Reset() override
{
//_Reset();
events.Reset();
- Initialize();
+ _phase = PHASE_NONE;
}
void JustEngagedWith(Unit* who) override
@@ -87,23 +78,18 @@ struct boss_anzu : public BossAI
events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 5s);
}
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- }
-
void DamageTaken(Unit* /*killer*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
- if (me->HealthBelowPctDamaged(33, damage) && !_under33Percent)
+ if (_phase < PHASE_HEALTH_66 && me->HealthBelowPctDamaged(66, damage))
{
- _under33Percent = true;
+ _phase++;
Talk(SAY_SUMMON_BROOD);
events.ScheduleEvent(EVENT_SUMMON, 3s);
}
- if (me->HealthBelowPctDamaged(66, damage) && !_under66Percent)
+ if (_phase < PHASE_HEALTH_33 && me->HealthBelowPctDamaged(33, damage))
{
- _under66Percent = true;
+ _phase++;
Talk(SAY_SUMMON_BROOD);
events.ScheduleEvent(EVENT_SUMMON, 3s);
}
@@ -122,19 +108,19 @@ struct boss_anzu : public BossAI
{
case EVENT_PARALYZING_SCREECH:
DoCastVictim(SPELL_PARALYZING_SCREECH);
- events.ScheduleEvent(EVENT_PARALYZING_SCREECH, 25s);
+ events.Repeat(25s);
break;
case EVENT_CYCLONE_OF_FEATHERS:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
DoCast(target, SPELL_CYCLONE_OF_FEATHERS);
- events.ScheduleEvent(EVENT_CYCLONE_OF_FEATHERS, 21s);
+ events.Repeat(21s);
break;
case EVENT_SUMMON:
// TODO: Add pathing for Brood of Anzu
for (uint8 i = 0; i < 7; i++)
me->SummonCreature(NPC_BROOD_OF_ANZU, PosSummonBrood[i], TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 46s);
- DoCast(me, SPELL_BANISH_SELF);
+ DoCastSelf(SPELL_BANISH_SELF);
events.ScheduleEvent(EVENT_SPELL_BOMB, 12s);
break;
case EVENT_SPELL_BOMB:
@@ -155,9 +141,8 @@ struct boss_anzu : public BossAI
DoMeleeAttackIfReady();
}
- private:
- bool _under33Percent;
- bool _under66Percent;
+private:
+ uint8 _phase;
};
void AddSC_boss_anzu()
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
index 0206f61eba0..ba1dbdc87ed 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_darkweaver_syth.cpp
@@ -15,18 +15,13 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Darkweaver_Syth
-SD%Complete: 85
-SDComment: Shock spells/times need more work. Heroic partly implemented.
-SDCategory: Auchindoun, Sethekk Halls
-EndScriptData */
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
+#include "SpellInfo.h"
#include "sethekk_halls.h"
-enum Says
+enum SythTexts
{
SAY_SUMMON = 0,
SAY_AGGRO = 1,
@@ -34,59 +29,56 @@ enum Says
SAY_DEATH = 3
};
-enum Spells
+enum SythSpells
{
- SPELL_FROST_SHOCK = 21401, //37865
+ SPELL_FROST_SHOCK = 21401,
SPELL_FLAME_SHOCK = 34354,
SPELL_SHADOW_SHOCK = 30138,
SPELL_ARCANE_SHOCK = 37132,
- SPELL_CHAIN_LIGHTNING = 15659, //15305
+ SPELL_CHAIN_LIGHTNING = 15659,
- SPELL_SUMMON_SYTH_FIRE = 33537, // Spawns 19203
- SPELL_SUMMON_SYTH_ARCANE = 33538, // Spawns 19205
- SPELL_SUMMON_SYTH_FROST = 33539, // Spawns 19204
- SPELL_SUMMON_SYTH_SHADOW = 33540, // Spawns 19206
+ SPELL_SUMMON_ELEMENTALS = 33595,
- SPELL_FLAME_BUFFET = 33526,
- SPELL_ARCANE_BUFFET = 33527,
- SPELL_FROST_BUFFET = 33528,
- SPELL_SHADOW_BUFFET = 33529
+ SPELL_SUMMON_SYTH_FIRE = 33537,
+ SPELL_SUMMON_SYTH_ARCANE = 33538,
+ SPELL_SUMMON_SYTH_FROST = 33539,
+ SPELL_SUMMON_SYTH_SHADOW = 33540
};
-enum Events
+enum SythEvents
{
EVENT_FLAME_SHOCK = 1,
- EVENT_ARCANE_SHOCK = 2,
- EVENT_FROST_SHOCK = 3,
- EVENT_SHADOW_SHOCK = 4,
- EVENT_CHAIN_LIGHTNING = 5
+ EVENT_ARCANE_SHOCK,
+ EVENT_FROST_SHOCK,
+ EVENT_SHADOW_SHOCK,
+ EVENT_CHAIN_LIGHTNING,
+ EVENT_SUMMON
};
-enum Lakka
+enum SythMisc
{
- NPC_LAKKA = 18956,
- SAY_LAKKA_FREE = 1
+ NPC_LAKKA = 18956,
+ SAY_LAKKA_FREE = 1
};
-struct boss_darkweaver_syth : public BossAI
+enum SythPhases : uint8
{
- boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH)
- {
- Initialize();
- }
+ PHASE_NONE = 0,
+ PHASE_HEALTH_90,
+ PHASE_HEALTH_55,
+ PHASE_HEALTH_10
+};
- void Initialize()
- {
- _summon90 = false;
- _summon50 = false;
- _summon10 = false;
- }
+// 18472 - Darkweaver Syth
+struct boss_darkweaver_syth : public BossAI
+{
+ boss_darkweaver_syth(Creature* creature) : BossAI(creature, DATA_DARKWEAVER_SYTH), _phase(PHASE_NONE) { }
void Reset() override
{
- Initialize();
_Reset();
+ _phase = PHASE_NONE;
}
void JustEngagedWith(Unit* who) override
@@ -96,7 +88,7 @@ struct boss_darkweaver_syth : public BossAI
events.ScheduleEvent(EVENT_ARCANE_SHOCK, 4s);
events.ScheduleEvent(EVENT_FROST_SHOCK, 6s);
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 8s);
- events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 15s);
+ events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 10s, 15s);
Talk(SAY_AGGRO);
}
@@ -124,81 +116,102 @@ struct boss_darkweaver_syth : public BossAI
summons.Summon(summoned);
}
+ void OnSpellCast(SpellInfo const* spell) override
+ {
+ if (spell->Id == SPELL_SUMMON_ELEMENTALS)
+ Talk(SAY_SUMMON);
+ }
+
void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
{
- if (me->HealthBelowPctDamaged(90, damage) && !_summon90)
+ if (_phase < PHASE_HEALTH_90 && me->HealthBelowPctDamaged(90, damage))
{
- SythSummoning();
- _summon90 = true;
+ _phase++;
+ events.ScheduleEvent(EVENT_SUMMON, 0s);
}
- if (me->HealthBelowPctDamaged(50, damage) && !_summon50)
+ if (_phase < PHASE_HEALTH_55 && me->HealthBelowPctDamaged(55, damage))
{
- SythSummoning();
- _summon50 = true;
+ _phase++;
+ events.ScheduleEvent(EVENT_SUMMON, 0s);
}
- if (me->HealthBelowPctDamaged(10, damage) && !_summon10)
+ if (_phase < PHASE_HEALTH_10 && me->HealthBelowPctDamaged(10, damage))
{
- SythSummoning();
- _summon10 = true;
+ _phase++;
+ events.ScheduleEvent(EVENT_SUMMON, 0s);
}
}
- void SythSummoning()
- {
- Talk(SAY_SUMMON);
-
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(false);
-
- DoCast(me, SPELL_SUMMON_SYTH_ARCANE, true); //front
- DoCast(me, SPELL_SUMMON_SYTH_FIRE, true); //back
- DoCast(me, SPELL_SUMMON_SYTH_FROST, true); //left
- DoCast(me, SPELL_SUMMON_SYTH_SHADOW, true); //right
- }
-
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
{
case EVENT_FLAME_SHOCK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_FLAME_SHOCK);
- events.ScheduleEvent(EVENT_FLAME_SHOCK, 10s, 15s);
+ DoCastVictim(SPELL_FLAME_SHOCK);
+ events.Repeat(10s, 15s);
break;
case EVENT_ARCANE_SHOCK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_ARCANE_SHOCK);
- events.ScheduleEvent(EVENT_ARCANE_SHOCK, 10s, 15s);
+ DoCastVictim(SPELL_ARCANE_SHOCK);
+ events.Repeat(10s, 15s);
break;
case EVENT_FROST_SHOCK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_FROST_SHOCK);
- events.ScheduleEvent(EVENT_FROST_SHOCK, 10s, 15s);
+ DoCastVictim(SPELL_FROST_SHOCK);
+ events.Repeat(10s, 15s);
break;
case EVENT_SHADOW_SHOCK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_SHADOW_SHOCK);
- events.ScheduleEvent(EVENT_SHADOW_SHOCK, 10s, 15s);
+ DoCastVictim(SPELL_SHADOW_SHOCK);
+ events.Repeat(10s, 15s);
break;
case EVENT_CHAIN_LIGHTNING:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_CHAIN_LIGHTNING);
- events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 25s);
+ DoCastVictim(SPELL_CHAIN_LIGHTNING);
+ events.Repeat(25s);
+ break;
+ case EVENT_SUMMON:
+ DoCastSelf(SPELL_SUMMON_ELEMENTALS);
break;
default:
break;
}
}
- private:
- bool _summon90;
- bool _summon50;
- bool _summon10;
+private:
+ uint8 _phase;
+};
+
+// 33595 - Summon Elementals
+class spell_darkweaver_syth_summon_elementals : public SpellScript
+{
+ PrepareSpellScript(spell_darkweaver_syth_summon_elementals);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo(
+ {
+ SPELL_SUMMON_SYTH_ARCANE,
+ SPELL_SUMMON_SYTH_FIRE,
+ SPELL_SUMMON_SYTH_FROST,
+ SPELL_SUMMON_SYTH_SHADOW
+ });
+ }
+
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ Unit* caster = GetCaster();
+ caster->CastSpell(caster, SPELL_SUMMON_SYTH_ARCANE, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD);
+ caster->CastSpell(caster, SPELL_SUMMON_SYTH_FIRE, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD);
+ caster->CastSpell(caster, SPELL_SUMMON_SYTH_FROST, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD);
+ caster->CastSpell(caster, SPELL_SUMMON_SYTH_SHADOW, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_darkweaver_syth_summon_elementals::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
};
void AddSC_boss_darkweaver_syth()
{
RegisterSethekkHallsCreatureAI(boss_darkweaver_syth);
+ RegisterSpellScript(spell_darkweaver_syth_summon_elementals);
}
diff --git a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
index 06b5676e72e..1f53f1c02a6 100644
--- a/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
+++ b/src/server/scripts/Outland/Auchindoun/SethekkHalls/boss_talon_king_ikiss.cpp
@@ -21,7 +21,7 @@
#include "SpellScript.h"
#include "sethekk_halls.h"
-enum Says
+enum IkissTexts
{
SAY_INTRO = 0,
SAY_AGGRO = 1,
@@ -30,7 +30,7 @@ enum Says
EMOTE_ARCANE_EXPLOSION = 4
};
-enum Spells
+enum IkissSpells
{
SPELL_BLINK = 38194,
SPELL_BLINK_TELEPORT = 38203,
@@ -42,7 +42,7 @@ enum Spells
SPELL_ARCANE_EXPLOSION = 38197,
};
-enum Events
+enum IkissEvents
{
EVENT_POLYMORPH = 1,
EVENT_BLINK,
@@ -51,26 +51,23 @@ enum Events
EVENT_ARCANE_EXPLOSION
};
+// 18473 - Talon King Ikiss
struct boss_talon_king_ikiss : public BossAI
{
- boss_talon_king_ikiss(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS)
- {
- Intro = false;
- ManaShield = false;
- }
+ boss_talon_king_ikiss(Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS), _introDone(false), _manaShieldTriggered(false) { }
void Reset() override
{
_Reset();
- Intro = false;
- ManaShield = false;
+ _introDone = false;
+ _manaShieldTriggered = false;
}
void MoveInLineOfSight(Unit* who) override
{
- if (!Intro && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
+ if (!_introDone && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f))
{
- Intro = true;
+ _introDone = true;
Talk(SAY_INTRO);
}
@@ -88,6 +85,27 @@ struct boss_talon_king_ikiss : public BossAI
events.ScheduleEvent(EVENT_SLOW, 15s, 30s);
}
+ void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ {
+ if (!_manaShieldTriggered && me->HealthBelowPctDamaged(20, damage))
+ {
+ DoCastSelf(SPELL_MANA_SHIELD);
+ _manaShieldTriggered = true;
+ }
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
void ExecuteEvent(uint32 eventId) override
{
switch (eventId)
@@ -98,57 +116,34 @@ struct boss_talon_king_ikiss : public BossAI
DoCast(SelectTarget(SelectTargetMethod::Random, 0), SPELL_POLYMORPH);
else
DoCast(SelectTarget(SelectTargetMethod::MaxThreat, 1), SPELL_POLYMORPH);
- events.ScheduleEvent(EVENT_POLYMORPH, 15s, 17500ms);
+ events.Repeat(15s, 17500ms);
break;
case EVENT_ARCANE_VOLLEY:
- DoCast(me, SPELL_ARCANE_VOLLEY);
- events.ScheduleEvent(EVENT_ARCANE_VOLLEY, 7s, 12s);
+ DoCastSelf(SPELL_ARCANE_VOLLEY);
+ events.Repeat(7s, 12s);
break;
case EVENT_SLOW:
- DoCast(me, SPELL_SLOW);
- events.ScheduleEvent(EVENT_SLOW, 15s, 40s);
+ DoCastSelf(SPELL_SLOW);
+ events.Repeat(15s, 40s);
break;
case EVENT_BLINK:
- if (me->IsNonMeleeSpellCast(false))
- me->InterruptNonMeleeSpells(false);
Talk(EMOTE_ARCANE_EXPLOSION);
DoCastAOE(SPELL_BLINK);
events.ScheduleEvent(EVENT_BLINK, 35s, 40s);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 1s);
break;
case EVENT_ARCANE_EXPLOSION:
- DoCast(me, SPELL_ARCANE_EXPLOSION);
- DoCast(me, SPELL_ARCANE_BUBBLE, true);
+ DoCastSelf(SPELL_ARCANE_EXPLOSION);
+ DoCastSelf(SPELL_ARCANE_BUBBLE, true);
break;
default:
break;
}
}
- void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
- {
- if (!ManaShield && me->HealthBelowPctDamaged(20, damage))
- {
- DoCast(me, SPELL_MANA_SHIELD);
- ManaShield = true;
- }
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
-
- private:
- bool ManaShield;
- bool Intro;
+private:
+ bool _introDone;
+ bool _manaShieldTriggered;
};
// 38194 - Blink