diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp | 268 |
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(); } |