diff options
Diffstat (limited to 'src')
3 files changed, 160 insertions, 167 deletions
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 |
