aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp476
1 files changed, 429 insertions, 47 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
index c2d81a5f562..3376680181d 100644
--- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
+++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_auriaya.cpp
@@ -19,90 +19,472 @@
#include "ScriptedCreature.h"
#include "ulduar.h"
-//boss_auriaya
-#define SPELL_TERRIFYING_SCREECH 64386
-#define SPELL_SETINEL_BLAST 64679
-#define SPELL_SONIC_SCREECH 64422
-#define SPELL_SUMMON_SWARMING_GUARDIAN 64397
+enum AuriayaSpells
+{
+ // Auriaya
+ SPELL_SENTINEL_BLAST = 64389,
+ SPELL_SONIC_SCREECH = 64422,
+ SPELL_TERRIFYING_SCREECH = 64386,
+ SPELL_SUMMON_SWARMING_GUARDIAN = 64396,
+ SPELL_ACTIVATE_DEFENDER = 64449,
+ SPELL_DEFENDER_TRIGGER = 64448,
+ SPELL_SUMMON_DEFENDER = 64447,
+ SPELL_BERSERK = 47008,
+
+ // Feral Defender
+ SPELL_FERAL_RUSH = 64496,
+ SPELL_FERAL_POUNCE = 64478,
+ SPELL_SEEPING_ESSENCE = 64458,
+ SPELL_SUMMON_ESSENCE = 64457,
+ SPELL_FERAL_ESSENCE = 64455,
+
+ // Sanctum Sentry
+ SPELL_SAVAGE_POUNCE = 64666,
+ SPELL_RIP_FLESH = 64375,
+ SPELL_STRENGHT_PACK = 64369,
+};
+
+enum AuriayaNPCs
+{
+ NPC_SANCTUM_SENTRY = 34014,
+ NPC_FERAL_DEFENDER = 34035,
+ NPC_FERAL_DEFENDER_TRIGGER = 34096,
+ NPC_SEEPING_TRIGGER = 34098,
+};
+
+enum AuriayaEvents
+{
+ // Auriaya
+ EVENT_SCREECH = 1,
+ EVENT_BLAST = 2,
+ EVENT_TERRIFYING = 3,
+ EVENT_SUMMON = 4,
+ EVENT_DEFENDER = 5,
+ EVENT_ACTIVATE_DEFENDER = 6,
+ EVENT_RESPAWN_DEFENDER = 7,
+ EVENT_BERSERK = 8,
+
+ // Sanctum Sentry
+ EVENT_RIP = 9,
+ EVENT_POUNCE = 10,
+
+ // Feral Defender
+ EVENT_FERAL_POUNCE = 11,
+ EVENT_RUSH = 12,
+};
-enum Yells
+enum AuriayaYells
{
- SAY_AGGRO = -1603050,
- SAY_SLAY_1 = -1603051,
- SAY_SLAY_2 = -1603052,
- SAY_DEATH = -1603053,
- SAY_BERSERK = -1603054,
+ // Yells
+ SAY_AGGRO = -1603050,
+ SAY_SLAY_1 = -1603051,
+ SAY_SLAY_2 = -1603052,
+ SAY_DEATH = -1603053,
+ SAY_BERSERK = -1603054,
+
+ // Emotes
+ EMOTE_FEAR = -1603055,
+ EMOTE_DEFENDER = -1603056,
+};
+
+enum AuriayaActions
+{
+ ACTION_CRAZY_CAT_LADY = 0,
+ ACTION_RESPAWN_DEFENDER
};
+#define SENTRY_NUMBER RAID_MODE<uint8>(2, 4)
+
class boss_auriaya : public CreatureScript
{
-public:
- boss_auriaya() : CreatureScript("boss_auriaya") { }
+ public:
+ boss_auriaya() : CreatureScript("boss_auriaya") { }
+
+ struct boss_auriayaAI : public BossAI
+ {
+ boss_auriayaAI(Creature* creature) : BossAI(creature, BOSS_AURIAYA)
+ {
+ }
+
+ void Reset()
+ {
+ _Reset();
+ DefenderGUID = 0;
+ defenderLifes = 9;
+ crazyCatLady = true;
+ nineLives = false;
+ }
- CreatureAI* GetAI(Creature* pCreature) const
- {
- return new boss_auriaya_AI (pCreature);
- }
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ DoScriptText(SAY_AGGRO,me);
+
+ events.ScheduleEvent(EVENT_SCREECH, urand(45000, 65000));
+ events.ScheduleEvent(EVENT_BLAST, urand(20000, 25000));
+ events.ScheduleEvent(EVENT_TERRIFYING, urand(20000, 30000));
+ events.ScheduleEvent(EVENT_DEFENDER, urand(40000, 55000));
+ events.ScheduleEvent(EVENT_SUMMON, urand(45000, 55000));
+ events.ScheduleEvent(EVENT_BERSERK, 600000);
+ }
- struct boss_auriaya_AI : public BossAI
- {
- boss_auriaya_AI(Creature *pCreature) : BossAI(pCreature, BOSS_AURIAYA)
+ void KilledUnit(Unit* /*who*/)
+ {
+ DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
+ }
+
+ void JustSummoned(Creature* summoned)
+ {
+ summons.Summon(summoned);
+
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ {
+ summoned->AI()->AttackStart(target);
+ summoned->AddThreat(target, 250.0f);
+ DoZoneInCombat(summoned);
+ }
+
+ if (summoned->GetEntry() == NPC_FERAL_DEFENDER)
+ {
+ if (!summoned->isInCombat() && me->getVictim())
+ summoned->AI()->AttackStart(me->getVictim());
+ summoned->SetAuraStack(SPELL_FERAL_ESSENCE, summoned, 9);
+ DefenderGUID = summoned->GetGUID();
+ DoZoneInCombat(summoned);
+ }
+ }
+
+ void DoAction(int32 const action)
+ {
+ switch (action)
+ {
+ case ACTION_CRAZY_CAT_LADY:
+ crazyCatLady = false;
+ break;
+ case ACTION_RESPAWN_DEFENDER:
+ defenderLifes--;
+ if (!defenderLifes)
+ {
+ nineLives = true;
+ break;
+ }
+ events.ScheduleEvent(EVENT_RESPAWN_DEFENDER, 30000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ void JustDied(Unit* /*who*/)
+ {
+ DoScriptText(SAY_DEATH, me);
+ _JustDied();
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SCREECH:
+ DoCast(SPELL_SONIC_SCREECH);
+ events.ScheduleEvent(EVENT_SCREECH, urand(40000, 60000));
+ break;
+ case EVENT_TERRIFYING:
+ DoScriptText(EMOTE_FEAR, me);
+ DoCast(SPELL_TERRIFYING_SCREECH);
+ events.ScheduleEvent(EVENT_TERRIFYING, urand(20000, 30000));
+ break;
+ case EVENT_BLAST:
+ DoCastAOE(SPELL_SENTINEL_BLAST);
+ events.ScheduleEvent(EVENT_BLAST, urand(25000, 35000));
+ break;
+ case EVENT_DEFENDER:
+ DoScriptText(EMOTE_DEFENDER, me);
+ DoCast(SPELL_DEFENDER_TRIGGER);
+ if (Creature* trigger = me->FindNearestCreature(NPC_FERAL_DEFENDER_TRIGGER, 15.0f, true))
+ DoCast(trigger, SPELL_ACTIVATE_DEFENDER, true);
+ break;
+ case EVENT_RESPAWN_DEFENDER:
+ if (Creature* Defender = ObjectAccessor::GetCreature(*me, DefenderGUID))
+ {
+ Defender->Respawn();
+ if (defenderLifes)
+ Defender->SetAuraStack(SPELL_FERAL_ESSENCE, Defender, defenderLifes);
+ Defender->SetInCombatWithZone();
+ if (!Defender->isInCombat())
+ Defender->AI()->AttackStart(me->getVictim());
+ events.CancelEvent(EVENT_RESPAWN_DEFENDER);
+ }
+ break;
+ case EVENT_SUMMON:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ DoCast(target, SPELL_SUMMON_SWARMING_GUARDIAN);
+ events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000));
+ break;
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_BERSERK, true);
+ DoScriptText(SAY_BERSERK, me);
+ events.CancelEvent(EVENT_BERSERK);
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ uint64 DefenderGUID;
+ uint8 defenderLifes;
+ bool crazyCatLady;
+ bool nineLives;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
+ return GetUlduarAI<boss_auriayaAI>(creature);
}
+};
- uint32 TERRIFYING_SCREECH_Timer;
- uint32 SONIC_SCREECH_Timer;
+class npc_auriaya_seeping_trigger : public CreatureScript
+{
+ public:
+ npc_auriaya_seeping_trigger() : CreatureScript("npc_auriaya_seeping_trigger") { }
+
+ struct npc_auriaya_seeping_triggerAI : public ScriptedAI
+ {
+ npc_auriaya_seeping_triggerAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ }
void Reset()
{
- _Reset();
- TERRIFYING_SCREECH_Timer = 180000;
- SONIC_SCREECH_Timer = 30000;
+ me->ForcedDespawn(600000);
+ DoCast(me, SPELL_SEEPING_ESSENCE);
}
- void EnterCombat(Unit* /*who*/)
+ void UpdateAI(uint32 const /*diff*/)
{
- _EnterCombat();
- DoScriptText(SAY_AGGRO, me);
+ if (instance->GetBossState(BOSS_AURIAYA) != IN_PROGRESS)
+ me->ForcedDespawn();
}
- void KilledUnit(Unit* /*victim*/)
+ private:
+ InstanceScript* instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
{
- DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
+ return new npc_auriaya_seeping_triggerAI(creature);
}
+};
- void JustDied(Unit* /*victim*/)
+class npc_sanctum_sentry : public CreatureScript
+{
+ public:
+ npc_sanctum_sentry() : CreatureScript("npc_sanctum_sentry") { }
+
+ struct npc_sanctum_sentryAI : public ScriptedAI
{
- DoScriptText(SAY_DEATH, me);
- _JustDied();
+ npc_sanctum_sentryAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ }
+
+ void Reset()
+ {
+ events.ScheduleEvent(EVENT_RIP, urand(4000,8000));
+ events.ScheduleEvent(EVENT_POUNCE, urand(12000,15000));
+ }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ DoCast(me, SPELL_STRENGHT_PACK, true);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_RIP:
+ DoCastVictim(SPELL_RIP_FLESH);
+ events.ScheduleEvent(EVENT_RIP, urand(12000, 15000));
+ break;
+ case EVENT_POUNCE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ {
+ me->AddThreat(target, 100.0f);
+ me->AI()->AttackStart(target);
+ DoCast(target, SPELL_SAVAGE_POUNCE);
+ }
+ events.ScheduleEvent(EVENT_POUNCE, urand(12000,17000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* /*who*/)
+ {
+ if (Creature* Auriaya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_AURIAYA)))
+ Auriaya->AI()->DoAction(ACTION_CRAZY_CAT_LADY);
+ }
+
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_sanctum_sentryAI(creature);
}
+};
- void MoveInLineOfSight(Unit* /*who*/) {}
+class npc_feral_defender : public CreatureScript
+{
+ public:
+ npc_feral_defender() : CreatureScript("npc_feral_defender") { }
- void UpdateAI(const uint32 diff)
+ struct npc_feral_defenderAI : public ScriptedAI
{
- if (!UpdateVictim())
- return;
+ npc_feral_defenderAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = me->GetInstanceScript();
+ }
+
+ void Reset()
+ {
+ if (me->HasAura(SPELL_FERAL_ESSENCE))
+ me->RemoveAuraFromStack(SPELL_FERAL_ESSENCE);
+ else
+ me->RemoveAurasDueToSpell(SPELL_FERAL_ESSENCE);
+ }
- if (TERRIFYING_SCREECH_Timer <= diff)
+ void UpdateAI(uint32 const diff)
{
- DoCast(SPELL_TERRIFYING_SCREECH);
- TERRIFYING_SCREECH_Timer = 180000;
- } else TERRIFYING_SCREECH_Timer -= diff;
+ if (!UpdateVictim())
+ return;
- if (SONIC_SCREECH_Timer <= diff)
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FERAL_POUNCE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ {
+ me->AddThreat(target, 100.0f);
+ me->AI()->AttackStart(target);
+ DoCast(target, SPELL_FERAL_POUNCE);
+ }
+ events.ScheduleEvent(EVENT_FERAL_POUNCE, urand(10000, 12000));
+ break;
+ case EVENT_RUSH:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
+ {
+ me->AddThreat(target, 100.0f);
+ me->AI()->AttackStart(target);
+ DoCast(target, SPELL_FERAL_RUSH);
+ }
+ events.ScheduleEvent(EVENT_RUSH, urand(10000, 12000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit* /*who*/)
{
- DoCastVictim(SPELL_SONIC_SCREECH);
- SONIC_SCREECH_Timer = 30000;
- } else SONIC_SCREECH_Timer -= diff;
+ DoCast(me, SPELL_SUMMON_ESSENCE);
+ if (Creature* Auriaya = ObjectAccessor::GetCreature(*me, instance->GetData64(BOSS_AURIAYA)))
+ Auriaya->AI()->DoAction(ACTION_RESPAWN_DEFENDER);
+ }
+
+ private:
+ InstanceScript* instance;
+ EventMap events;
+ };
- DoMeleeAttackIfReady();
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_feral_defenderAI(creature);
}
- };
+};
+
+class SanctumSentryCheck
+{
+ public:
+ bool operator() (Unit* unit)
+ {
+ if (unit->GetEntry() == NPC_SANCTUM_SENTRY)
+ return false;
+ return true;
+ }
+};
+
+class spell_auriaya_strenght_of_the_pack : public SpellScriptLoader
+{
+ public:
+ spell_auriaya_strenght_of_the_pack() : SpellScriptLoader("spell_auriaya_strenght_of_the_pack") { }
+
+ class spell_auriaya_strenght_of_the_pack_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_auriaya_strenght_of_the_pack_SpellScript);
+
+ void FilterTargets(std::list<Unit*>& unitList)
+ {
+ unitList.remove_if(SanctumSentryCheck());
+ }
+
+ void Register()
+ {
+ OnUnitTargetSelect += SpellUnitTargetFn(spell_auriaya_strenght_of_the_pack_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ALLY_SRC);
+ }
+ };
+
+ SpellScript* GetSpellScript() const
+ {
+ return new spell_auriaya_strenght_of_the_pack_SpellScript();
+ }
};
void AddSC_boss_auriaya()
{
new boss_auriaya();
+ new npc_auriaya_seeping_trigger();
+ new npc_feral_defender();
+ new npc_sanctum_sentry();
+ new spell_auriaya_strenght_of_the_pack();
}