aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp244
1 files changed, 237 insertions, 7 deletions
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp
index ac517013fc8..832bf141ba1 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sister_svalna.cpp
@@ -22,7 +22,6 @@
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "ScriptedEscortAI.h"
-#include "SmartAI.h"
#include "SpellScript.h"
#include "VehicleDefines.h"
@@ -100,6 +99,27 @@ enum ICCSisterSvalnaSpells
SPELL_FEL_IRON_BOMB_UNDEAD = 71787,
SPELL_MACHINE_GUN_UNDEAD = 71788,
SPELL_ROCKET_LAUNCH_UNDEAD = 71786,
+
+ // Ymirjar Vrykuls
+ SPELL_ARCTIC_CHILL = 71270,
+ SPELL_FROZEN_ORB_CAST = 71274,
+ SPELL_FROZEN_ORB_MISSILE = 71285,
+ SPELL_SPIRIT_STREAM = 69929,
+ SPELL_TWISTED_WINDS = 71306,
+ SPELL_BARBARIC_STRIKE = 71257,
+ SPELL_ADRENALINE_RUSH = 71258,
+ SPELL_WHIRLWIND = 41056,
+ SPELL_RAPID_SHOT = 71251,
+ SPELL_ICE_TRAP = 71249,
+ SPELL_SUMMON_WARHAWK = 71705,
+ SPELL_VOLLEY = 71252,
+ SPELL_YMIRJAR_SHOOT = 71253,
+ SPELL_YMIRJAR_SHADOW_BOLT = 71296,
+ SPELL_DEATH_EMBRACE = 71299,
+ SPELL_BANISH = 71298,
+ SPELL_SUMMON_YMIRJAR = 71303,
+ SPELL_AWAKEN_YMIRJAR_FALLEN = 71302,
+ SPELL_WARLORDS_PRESENCE = 71244,
};
enum ICCSisterSvalnaTimedEventIds
@@ -141,6 +161,22 @@ enum ICCSisterSvalnaTimedEventIds
EVENT_RUPERT_FEL_IRON_BOMB,
EVENT_RUPERT_MACHINE_GUN,
EVENT_RUPERT_ROCKET_LAUNCH,
+
+ // Ymirjar Vrykuls
+ EVENT_YMIRJAR_FROZEN_ORB,
+ EVENT_YMIRJAR_TWISTED_WINDS,
+ EVENT_YMIRJAR_SPIRIT_STREAM,
+ EVENT_YMIRJAR_BARBARIC_STRIKE,
+ EVENT_YMIRJAR_ADRENALINE_RUSH,
+ EVENT_YMIRJAR_WHIRLWIND,
+ EVENT_YMIRJAR_RAPID_SHOT,
+ EVENT_YMIRJAR_ICE_TRAP,
+ EVENT_YMIRJAR_VOLLEY,
+ EVENT_YMIRJAR_SHOOT,
+ EVENT_YMIRJAR_SHADOW_BOLT,
+ EVENT_YMIRJAR_DEATH_EMBRACE,
+ EVENT_YMIRJAR_BANISH,
+ EVENT_YMIRJAR_SUMMON,
};
enum ICCSisterSvalnaActions
@@ -157,6 +193,11 @@ enum ICCSisterSvalnaMovePoints
POINT_SVALNA_LAND = 1
};
+enum ICCYmirjarFrostWingMisc
+{
+ NPC_YMIRJAR_WARHAWK = 38154
+};
+
// Helper defines
// Captain Arnath
#define SPELL_FLASH_HEAL (IsUndead ? SPELL_FLASH_HEAL_UNDEAD : SPELL_FLASH_HEAL_NORMAL)
@@ -1119,17 +1160,206 @@ struct npc_captain_rupert : public npc_argent_captainAI
}
};
-struct npc_frostwing_vrykul : public SmartAI
+struct npc_frostwing_ymirjar_vrykul : public ScriptedAI
{
- npc_frostwing_vrykul(Creature* creature) : SmartAI(creature)
+ npc_frostwing_ymirjar_vrykul(Creature* creature) : ScriptedAI(creature), _summons(creature)
{
}
- bool CanAIAttack(Unit const* target) const override
+ void Reset() override
{
- // do not see targets inside Frostwing Halls when we are not there
- return (me->GetPositionY() > 2660.0f) == (target->GetPositionY() > 2660.0f) && SmartAI::CanAIAttack(target);
+ _events.Reset();
+ _OOCevents.Reset();
+ _summons.DespawnAll();
+
+ if (!me->IsAlive())
+ return;
+
+ switch (me->GetEntry())
+ {
+ case NPC_YMIRJAR_FROSTBINDER:
+ me->RemoveAurasDueToSpell(SPELL_ARCTIC_CHILL);
+ /* fallthrough */
+ case NPC_YMIRJAR_DEATHBRINGER:
+ _OOCevents.ScheduleEvent(EVENT_YMIRJAR_SPIRIT_STREAM, 10s, 20s);
+ break;
+ case NPC_YMIRJAR_HUNTRESS:
+ if (Is25ManRaid())
+ DoCast(SPELL_SUMMON_WARHAWK);
+ break;
+ default:
+ break;
+ }
}
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (me->GetEntry() == NPC_YMIRJAR_WARLORD)
+ me->RemoveAurasDueToSpell(SPELL_WARLORDS_PRESENCE);
+ }
+
+ void JustSummoned(Creature* summon) override
+ {
+ if (summon->GetEntry() == NPC_YMIRJAR_WARHAWK)
+ summon->SetReactState(REACT_DEFENSIVE);
+
+ _summons.Summon(summon);
+
+ if (me->IsEngaged())
+ DoZoneInCombat(summon);
+ }
+
+ void SummonedCreatureDespawn(Creature* summon) override
+ {
+ _summons.Despawn(summon);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ if (!who)
+ return;
+
+ me->InterruptNonMeleeSpells(false);
+
+ switch (me->GetEntry())
+ {
+ case NPC_YMIRJAR_FROSTBINDER:
+ DoCast(SPELL_ARCTIC_CHILL);
+ _events.ScheduleEvent(EVENT_YMIRJAR_FROZEN_ORB, 5s, 10s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_TWISTED_WINDS, 10s, 20s);
+ break;
+ case NPC_YMIRJAR_BATTLE_MAIDEN:
+ _events.ScheduleEvent(EVENT_YMIRJAR_BARBARIC_STRIKE, 5s, 8s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_ADRENALINE_RUSH, 10s, 20s);
+ break;
+ case NPC_YMIRJAR_WARLORD:
+ _events.ScheduleEvent(EVENT_YMIRJAR_WHIRLWIND, 5s, 8s);
+ break;
+ case NPC_YMIRJAR_HUNTRESS:
+ _events.ScheduleEvent(EVENT_YMIRJAR_RAPID_SHOT, 10s, 20s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_ICE_TRAP, 5s, 10s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_VOLLEY, 20s, 30s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_SHOOT, 1s);
+ break;
+ case NPC_YMIRJAR_DEATHBRINGER:
+ _events.ScheduleEvent(EVENT_YMIRJAR_SHADOW_BOLT, 6s, 1s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_DEATH_EMBRACE, 5s, 10s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_BANISH, 10s, 20s);
+ _events.ScheduleEvent(EVENT_YMIRJAR_SUMMON, 10s, 25s);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ {
+ _OOCevents.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _OOCevents.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_YMIRJAR_SPIRIT_STREAM:
+ DoCast(SPELL_SPIRIT_STREAM);
+ _OOCevents.Repeat(40s, 60s);
+ break;
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ return;
+ }
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_YMIRJAR_FROZEN_ORB:
+ DoCast(me, SPELL_FROZEN_ORB_CAST);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_TWISTED_WINDS:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.f, true))
+ DoCast(target, SPELL_TWISTED_WINDS);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_BARBARIC_STRIKE:
+ DoCastVictim(SPELL_BARBARIC_STRIKE);
+ _events.Repeat(2s, 4s);
+ break;
+ case EVENT_YMIRJAR_ADRENALINE_RUSH:
+ me->AddAura(SPELL_ADRENALINE_RUSH, me);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_WHIRLWIND:
+ DoCastAOE(SPELL_WHIRLWIND);
+ _events.Repeat(6s, 12s);
+ break;
+ case EVENT_YMIRJAR_RAPID_SHOT:
+ DoCast(SPELL_RAPID_SHOT);
+ _events.Repeat(20s, 30s);
+ break;
+ case EVENT_YMIRJAR_ICE_TRAP:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true))
+ DoCast(target, SPELL_ICE_TRAP);
+ _events.Repeat(15s, 20s);
+ break;
+ case EVENT_YMIRJAR_VOLLEY:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 40.0f, true))
+ DoCast(target, SPELL_VOLLEY);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_SHOOT:
+ DoCastVictim(SPELL_YMIRJAR_SHOOT);
+ _events.Repeat(2s);
+ break;
+ case EVENT_YMIRJAR_SHADOW_BOLT:
+ DoCastVictim(SPELL_YMIRJAR_SHADOW_BOLT);
+ _events.Repeat(5s, 8s);
+ break;
+ case EVENT_YMIRJAR_DEATH_EMBRACE:
+ DoCast(SPELL_DEATH_EMBRACE);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_BANISH:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 20.0f, true))
+ DoCast(target, SPELL_BANISH);
+ _events.Repeat(10s, 20s);
+ break;
+ case EVENT_YMIRJAR_SUMMON:
+ DoCast(SPELL_SUMMON_YMIRJAR);
+ _events.DelayEvents(2s);
+ _events.Repeat(90s);
+ break;
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+private:
+ EventMap _events;
+ EventMap _OOCevents;
+ SummonList _summons;
};
struct npc_impaling_spear : public CreatureAI
@@ -1250,7 +1480,7 @@ void AddSC_boss_sister_svalna()
RegisterIcecrownCitadelCreatureAI(npc_captain_brandon);
RegisterIcecrownCitadelCreatureAI(npc_captain_grondel);
RegisterIcecrownCitadelCreatureAI(npc_captain_rupert);
- RegisterIcecrownCitadelCreatureAI(npc_frostwing_vrykul);
+ RegisterIcecrownCitadelCreatureAI(npc_frostwing_ymirjar_vrykul);
RegisterIcecrownCitadelCreatureAI(npc_impaling_spear);
new spell_trigger_spell_from_caster("spell_svalna_caress_of_death", SPELL_IMPALING_SPEAR_KILL);
RegisterSpellScript(spell_svalna_revive_champion);