aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp268
1 files changed, 142 insertions, 126 deletions
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
index 629fc42dcd6..a86f77c14fc 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp
@@ -29,7 +29,6 @@ enum Yells
SAY_SLAY_2 = -1533015,
SAY_DEATH = -1533016
};
-//#define SOUND_RANDOM_AGGRO 8955 //soundId containing the 4 aggro sounds, we not using this
enum Spells
{
@@ -43,179 +42,196 @@ enum Spells
H_SPELL_WIDOWS_EMBRACE = 54097
};
+#define SPELL_WIDOWS_EMBRACE_HELPER RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)
+
enum Events
{
- EVENT_NONE,
- EVENT_POISON,
- EVENT_FIRE,
- EVENT_FRENZY
+ EVENT_POISON = 1,
+ EVENT_FIRE = 2,
+ EVENT_FRENZY = 3
};
-enum Achievements
-{
- ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_10 = 1997,
- ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_25 = 2140
-};
+#define DATA_FRENZY_DISPELS 1
class boss_faerlina : public CreatureScript
{
-public:
- boss_faerlina() : CreatureScript("boss_faerlina") { }
-
- CreatureAI* GetAI(Creature* pCreature) const
- {
- return new boss_faerlinaAI (pCreature);
- }
+ public:
+ boss_faerlina() : CreatureScript("boss_faerlina") { }
- struct boss_faerlinaAI : public BossAI
- {
- boss_faerlinaAI(Creature *c) : BossAI(c, BOSS_FAERLINA), greet(false) {}
-
- bool greet;
- bool doDelayFrenzy;
- bool bAchievement;
-
- void EnterCombat(Unit * /*who*/)
+ struct boss_faerlinaAI : public BossAI
{
- _EnterCombat();
- DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2, SAY_AGGRO_3, SAY_AGGRO_4), me);
- events.ScheduleEvent(EVENT_POISON, urand(10000, 15000));
- events.ScheduleEvent(EVENT_FIRE, urand(6000, 18000));
- events.ScheduleEvent(EVENT_FRENZY, urand(60000, 80000));
- }
+ boss_faerlinaAI(Creature* creature) : BossAI(creature, BOSS_FAERLINA),
+ _frenzyDispels(0), _introDone(false), _delayFrenzy(false)
+ {
+ }
- void Reset()
- {
- doDelayFrenzy = false;
- bAchievement = true;
- _Reset();
- }
- void MoveInLineOfSight(Unit *who)
- {
- if (!greet && who->GetTypeId() == TYPEID_PLAYER)
+ void EnterCombat(Unit* /*who*/)
{
- DoScriptText(SAY_GREET, me);
- greet = true;
+ _EnterCombat();
+ DoScriptText(RAND(SAY_AGGRO_1, SAY_AGGRO_2, SAY_AGGRO_3, SAY_AGGRO_4), me);
+ events.ScheduleEvent(EVENT_POISON, urand(10000, 15000));
+ events.ScheduleEvent(EVENT_FIRE, urand(6000, 18000));
+ events.ScheduleEvent(EVENT_FRENZY, urand(60000, 80000));
}
- BossAI::MoveInLineOfSight(who);
- }
- void KilledUnit(Unit* /*victim*/)
- {
- if (!(rand()%3))
- DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
- }
+ void Reset()
+ {
+ _Reset();
+ _delayFrenzy = false;
+ _frenzyDispels = 0;
+ }
- void JustDied(Unit* /*Killer*/)
- {
- _JustDied();
- DoScriptText(SAY_DEATH, me);
+ void MoveInLineOfSight(Unit* who)
+ {
+ if (!_introDone && who->GetTypeId() == TYPEID_PLAYER)
+ {
+ DoScriptText(SAY_GREET, me);
+ _introDone = true;
+ }
- if (instance && bAchievement)
- instance->DoCompleteAchievement(RAID_MODE(ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_10, ACHIEVEMENT_MOMMA_SAID_KNOCK_YOU_OUT_25));
- }
+ BossAI::MoveInLineOfSight(who);
+ }
- void UpdateAI(const uint32 diff)
- {
- if (!UpdateVictim())
- return;
+ void KilledUnit(Unit* /*victim*/)
+ {
+ if (!urand(0, 2))
+ DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2), me);
+ }
- if (doDelayFrenzy && !me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)))
+ void JustDied(Unit* /*killer*/)
{
- doDelayFrenzy = false;
- DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY), true);
+ _JustDied();
+ DoScriptText(SAY_DEATH, me);
+ }
+
+ void SpellHit(Unit* caster, SpellEntry const* spell)
+ {
+ if (spell->Id == SPELL_WIDOWS_EMBRACE || spell->Id == H_SPELL_WIDOWS_EMBRACE)
+ {
+ // TODO : Add Text
+ ++_frenzyDispels;
+ _delayFrenzy = true;
+ me->Kill(caster);
+ }
}
- events.Update(diff);
+ uint32 GetData(uint32 type)
+ {
+ if (type == DATA_FRENZY_DISPELS)
+ return _frenzyDispels;
- if (me->HasUnitState(UNIT_STAT_CASTING))
- return;
+ return 0;
+ }
- while (uint32 eventId = events.ExecuteEvent())
+ void UpdateAI(uint32 const diff)
{
- switch(eventId)
+ if (!UpdateVictim())
+ return;
+
+ if (_delayFrenzy && !me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
+ {
+ _delayFrenzy = false;
+ DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY), true);
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
{
- case EVENT_POISON:
- if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)))
- DoCastAOE(RAID_MODE(SPELL_POISON_BOLT_VOLLEY, H_SPELL_POISON_BOLT_VOLLEY));
- events.ScheduleEvent(EVENT_POISON, urand(8000, 15000));
- break;
- case EVENT_FIRE:
- if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0))
- DoCast(pTarget, RAID_MODE(SPELL_RAIN_OF_FIRE, H_SPELL_RAIN_OF_FIRE));
- events.ScheduleEvent(EVENT_FIRE, urand(6000, 18000));
- break;
- case EVENT_FRENZY:
- // TODO : Add Text
- if (!me->HasAura(RAID_MODE(SPELL_WIDOWS_EMBRACE, H_SPELL_WIDOWS_EMBRACE)))
- DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY));
- else
- doDelayFrenzy = true;
-
- events.ScheduleEvent(EVENT_FRENZY, urand(60000, 80000));
- break;
+ switch (eventId)
+ {
+ case EVENT_POISON:
+ if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
+ DoCastAOE(RAID_MODE(SPELL_POISON_BOLT_VOLLEY, H_SPELL_POISON_BOLT_VOLLEY));
+ events.ScheduleEvent(EVENT_POISON, urand(8000, 15000));
+ break;
+ case EVENT_FIRE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
+ DoCast(target, RAID_MODE(SPELL_RAIN_OF_FIRE, H_SPELL_RAIN_OF_FIRE));
+ events.ScheduleEvent(EVENT_FIRE, urand(6000, 18000));
+ break;
+ case EVENT_FRENZY:
+ // TODO : Add Text
+ if (!me->HasAura(SPELL_WIDOWS_EMBRACE_HELPER))
+ DoCast(me, RAID_MODE(SPELL_FRENZY, H_SPELL_FRENZY));
+ else
+ _delayFrenzy = true;
+
+ events.ScheduleEvent(EVENT_FRENZY, urand(60000, 80000));
+ break;
+ }
}
+
+ DoMeleeAttackIfReady();
}
- DoMeleeAttackIfReady();
- }
+ private:
+ uint32 _frenzyDispels;
+ bool _introDone;
+ bool _delayFrenzy;
+ };
- void SpellHit(Unit* caster, const SpellEntry *spell)
+ CreatureAI* GetAI(Creature* creature) const
{
- if (spell->Id == SPELL_WIDOWS_EMBRACE || spell->Id == H_SPELL_WIDOWS_EMBRACE)
- {
- // TODO : Add Text
- bAchievement = false;
- doDelayFrenzy = true;
- me->Kill(caster);
- }
+ return new boss_faerlinaAI(creature);
}
- };
-
};
class mob_faerlina_add : public CreatureScript
{
-public:
- mob_faerlina_add() : CreatureScript("mob_faerlina_add") { }
-
- CreatureAI* GetAI(Creature* pCreature) const
- {
- return new mob_faerlina_addAI (pCreature);
- }
+ public:
+ mob_faerlina_add() : CreatureScript("mob_faerlina_add") { }
- struct mob_faerlina_addAI : public ScriptedAI
- {
- mob_faerlina_addAI(Creature* pCreature) : ScriptedAI(pCreature)
+ struct mob_faerlina_addAI : public ScriptedAI
{
- pInstance = pCreature->GetInstanceScript();
- }
-
- InstanceScript *pInstance;
+ mob_faerlina_addAI(Creature* pCreature) : ScriptedAI(pCreature),
+ _instance(pCreature->GetInstanceScript())
+ {
+ }
- void Reset()
- {
- if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) {
- me->ApplySpellImmune(0, IMMUNITY_MECHANIC, SPELL_EFFECT_BIND, true);
- me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
+ void Reset()
+ {
+ if (GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL) {
+ me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_BIND, true);
+ me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_CHARM, true);
+ }
}
- }
- void JustDied(Unit * /*killer*/)
- {
- if (pInstance && GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ void JustDied(Unit* /*killer*/)
{
- if (Creature *pFaerlina = pInstance->instance->GetCreature(pInstance->GetData64(DATA_FAERLINA)))
- DoCast(pFaerlina, SPELL_WIDOWS_EMBRACE);
+ if (_instance && GetDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)
+ if (Creature* faerlina = ObjectAccessor::GetCreature(*me, _instance->GetData64(DATA_FAERLINA)))
+ DoCast(faerlina, SPELL_WIDOWS_EMBRACE);
}
+
+ private:
+ InstanceScript* const _instance;
+ };
+
+ CreatureAI* GetAI(Creature* pCreature) const
+ {
+ return new mob_faerlina_addAI(pCreature);
}
- };
+};
+class achievement_momma_said_knock_you_out : public AchievementCriteriaScript
+{
+ public:
+ achievement_momma_said_knock_you_out() : AchievementCriteriaScript("achievement_momma_said_knock_you_out") { }
+
+ bool OnCheck(Player* /*source*/, Unit* target)
+ {
+ return target && !target->GetAI()->GetData(DATA_FRENZY_DISPELS);
+ }
};
void AddSC_boss_faerlina()
{
new boss_faerlina();
new mob_faerlina_add();
+ new achievement_momma_said_knock_you_out();
}