diff options
-rw-r--r-- | sql/scripts/world_scripts_full.sql | 6 | ||||
-rw-r--r-- | sql/updates/world/2011_05_14_01_world_achievment_criteria_data.sql | 5 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp | 268 |
3 files changed, 151 insertions, 128 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index 6e8e2d4a36e..50effde5e57 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -1790,7 +1790,7 @@ UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_si' WHERE `TypeId`=5; UPDATE `outdoorpvp_template` SET `ScriptName`='outdoorpvp_ep' WHERE `TypeId`=6; /* ACHIEVEMENTS */ -DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013,12062,12063,12064,12065,12183,12068,12060,12061,12822,12996,12972,12989,10062,10063,10054,10055,10046,10047,10048,10049,10050,10051,10044,10045,6446,7625,7628,5541,5542,5543,7573,7574) AND `type` IN (0,11); +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (3693,3804,3805,3806,3807,3808,3809,3810,3811,3812,3813,1234,1239,5605,5606,12778,13036,13035,13037,12977,12967,12986,12982,12993,12780,13012,13011,13013,12062,12063,12064,12065,12183,12068,12060,12061,12822,12996,12972,12989,10062,10063,10054,10055,10046,10047,10048,10049,10050,10051,10044,10045,6446,7625,7628,5541,5542,5543,7573,7574,7265,7549) AND `type` IN (0,11); INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES (3693,11,0,0, 'achievement_storm_glory'), (3804,11,0,0, 'achievement_resilient_victory'), @@ -1850,7 +1850,9 @@ INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`, (5542,11,0,0,'achievement_arena_3v3_kills'), (5543,11,0,0,'achievement_arena_5v5_kills'), (7573,11,0,0,'achievement_denyin_the_scion'), -(7574,11,0,0,'achievement_denyin_the_scion'); +(7574,11,0,0,'achievement_denyin_the_scion'), +(7265,11,0,0,'achievement_momma_said_knock_you_out'), +(7549,11,0,0,'achievement_momma_said_knock_you_out'); /* SPELLS */ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES diff --git a/sql/updates/world/2011_05_14_01_world_achievment_criteria_data.sql b/sql/updates/world/2011_05_14_01_world_achievment_criteria_data.sql new file mode 100644 index 00000000000..8d53eba4a35 --- /dev/null +++ b/sql/updates/world/2011_05_14_01_world_achievment_criteria_data.sql @@ -0,0 +1,5 @@ +DELETE FROM `disables` WHERE `entry` IN (7265,7549) AND `sourceType`=4; +DELETE FROM `achievement_criteria_data` WHERE `criteria_id` IN (7265,7549) AND `type` IN (0,11); +INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`) VALUES +(7265,11,0,0,'achievement_momma_said_knock_you_out'), -- Momma Said Knock You Out (10 player) +(7549,11,0,0,'achievement_momma_said_knock_you_out'); -- Momma Said Knock You Out (25 player) 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(); } |