aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/scripts/world_scripts_full.sql6
-rw-r--r--sql/updates/world/2011_05_14_01_world_achievment_criteria_data.sql5
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_faerlina.cpp268
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();
}