diff options
author | Trazom62 <none@none> | 2010-04-27 22:26:30 +0200 |
---|---|---|
committer | Trazom62 <none@none> | 2010-04-27 22:26:30 +0200 |
commit | e719bd32a37152ed7ff978e18e4f5f610472d81e (patch) | |
tree | f254ff3ba090c71f1c99b42b92850b18b594ef6a | |
parent | 36ebd58b37aa70e3c68c00ac7126810da39f2de1 (diff) |
Fix timed achievement checks for boss killed in instance.
Requires DB update.
--HG--
branch : trunk
17 files changed, 243 insertions, 122 deletions
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 890733b5a20..214c5ca2327 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -339,6 +339,28 @@ void InstanceData::DoUpdateAchievementCriteria(AchievementCriteriaTypes type, ui pPlayer->UpdateAchievementCriteria(type, miscvalue1, miscvalue2, unit, time); } +// Start timed achievement for all players in instance +void InstanceData::DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) +{ + Map::PlayerList const &PlayerList = instance->GetPlayers(); + + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player *pPlayer = i->getSource()) + pPlayer->GetAchievementMgr().StartTimedAchievement(type, entry); +} + +// Stop timed achievement for all players in instance +void InstanceData::DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry) +{ + Map::PlayerList const &PlayerList = instance->GetPlayers(); + + if (!PlayerList.isEmpty()) + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + if (Player *pPlayer = i->getSource()) + pPlayer->GetAchievementMgr().RemoveTimedAchievement(type, entry); +} + // Remove Auras due to Spell on all players in instance void InstanceData::DoRemoveAurasDueToSpellOnPlayers(uint32 spell) { diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 31536a03a22..eb2c781aa91 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -162,6 +162,10 @@ class InstanceData : public ZoneScript // Update Achievement Criteria for all players in instance void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0); + // Start/Stop Timed Achievement Criteria for all players in instance + void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); + void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); + // Remove Auras due to Spell on all players in instance void DoRemoveAurasDueToSpellOnPlayers(uint32 spell); diff --git a/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp b/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp index 6bbe272df29..db151f88b8a 100644 --- a/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp +++ b/src/scripts/kalimdor/onyxias_lair/boss_onyxia.cpp @@ -66,7 +66,9 @@ enum PHASE_START = 1, PHASE_BREATH = 2, - PHASE_END = 3 + PHASE_END = 3, + + ACHIEV_TIMED_START_EVENT = 6601, }; struct sOnyxMove @@ -97,7 +99,12 @@ static float afSpawnLocations[2][3]= struct boss_onyxiaAI : public ScriptedAI { - boss_onyxiaAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();} + boss_onyxiaAI(Creature* pCreature) : ScriptedAI(pCreature) + { + instance = me->GetInstanceData(); + } + + InstanceData *instance; uint32 m_uiPhase; @@ -122,6 +129,9 @@ struct boss_onyxiaAI : public ScriptedAI void Reset() { + if (instance) + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + if (!IsCombatMovement()) SetCombatMovement(true); @@ -147,10 +157,13 @@ struct boss_onyxiaAI : public ScriptedAI m_bIsSummoningLairGuards = false; } - void Aggro(Unit* /*pWho*/) + void EnterCombat(Unit* /*pWho*/) { DoScriptText(SAY_AGGRO, me); me->SetInCombatWithZone(); + + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void JustSummoned(Creature *pSummoned) diff --git a/src/scripts/northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp b/src/scripts/northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp index d74b760fde7..486b8711fa4 100644 --- a/src/scripts/northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp +++ b/src/scripts/northrend/azjol_nerub/ahnkahet/boss_herald_volazj.cpp @@ -61,7 +61,7 @@ enum Yells enum Achievements { - ACHIEV_QUICK_DEMISE = 1862 + ACHIEV_QUICK_DEMISE_START_EVENT = 20382, }; struct boss_volazjAI : public ScriptedAI @@ -76,7 +76,6 @@ struct boss_volazjAI : public ScriptedAI uint32 uiMindFlayTimer; uint32 uiShadowBoltVolleyTimer; uint32 uiShiverTimer; - uint32 uiEncounterTimer; uint32 insanityHandled; SummonList Summons; @@ -143,13 +142,15 @@ struct boss_volazjAI : public ScriptedAI void Reset() { - uiEncounterTimer = 0; uiMindFlayTimer = 8*IN_MILISECONDS; uiShadowBoltVolleyTimer = 5*IN_MILISECONDS; uiShiverTimer = 15*IN_MILISECONDS; if (pInstance) + { pInstance->SetData(DATA_HERALD_VOLAZJ, NOT_STARTED); + pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); + } // Visible for all players in insanity me->SetPhaseMask((1|16|32|64|128|256),true); @@ -166,7 +167,10 @@ struct boss_volazjAI : public ScriptedAI DoScriptText(SAY_AGGRO, me); if (pInstance) + { pInstance->SetData(DATA_HERALD_VOLAZJ, IN_PROGRESS); + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT); + } } void JustSummoned(Creature *summon) @@ -278,20 +282,15 @@ struct boss_volazjAI : public ScriptedAI uiShiverTimer = 15*IN_MILISECONDS; } else uiShiverTimer -= diff; - uiEncounterTimer += diff; - DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH_1, me); if (pInstance) - { pInstance->SetData(DATA_HERALD_VOLAZJ, DONE); - if (IsHeroic() && uiEncounterTimer < 120*IN_MILISECONDS) - pInstance->DoCompleteAchievement(ACHIEV_QUICK_DEMISE); - } Summons.DespawnAll(); } diff --git a/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp b/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp index 340ae254b0f..1f7a0bcf1ed 100644 --- a/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp +++ b/src/scripts/northrend/azjol_nerub/azjol_nerub/boss_anubarak.cpp @@ -54,6 +54,11 @@ enum Yells SAY_DEATH = -1601004 }; +enum +{ + ACHIEV_TIMED_START_EVENT = 20381, +}; + const Position SpawnPoint[2] = { { 550.7, 282.8, 224.3 }, @@ -105,16 +110,21 @@ struct boss_anub_arakAI : public ScriptedAI lSummons.DespawnAll(); if (pInstance) + { pInstance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED); + pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } } - void EnterCombat(Unit * /*who*/) { DoScriptText(SAY_AGGRO, me); if (pInstance) + { pInstance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS); + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } } diff --git a/src/scripts/northrend/naxxramas/boss_anubrekhan.cpp b/src/scripts/northrend/naxxramas/boss_anubrekhan.cpp index 0439e73cc95..896eb068eb6 100644 --- a/src/scripts/northrend/naxxramas/boss_anubrekhan.cpp +++ b/src/scripts/northrend/naxxramas/boss_anubrekhan.cpp @@ -45,6 +45,11 @@ enum Spells SPELL_BERSERK = 27680, }; +enum +{ + ACHIEV_TIMED_START_EVENT = 9891, +}; + struct boss_anubrekhanAI : public BossAI { boss_anubrekhanAI(Creature *c) : BossAI(c, BOSS_ANUBREKHAN) {} @@ -83,6 +88,14 @@ struct boss_anubrekhanAI : public BossAI DoScriptText(SAY_SLAY, me); } + void JustDied(Unit *) + { + _JustDied(); + + // start achievement timer (kill Maexna within 20 min) + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } void EnterCombat(Unit * /*who*/) { _EnterCombat(); diff --git a/src/scripts/northrend/naxxramas/boss_patchwerk.cpp b/src/scripts/northrend/naxxramas/boss_patchwerk.cpp index d5d0d720378..e4472b299ce 100644 --- a/src/scripts/northrend/naxxramas/boss_patchwerk.cpp +++ b/src/scripts/northrend/naxxramas/boss_patchwerk.cpp @@ -44,8 +44,10 @@ enum Events EVENT_SLIME }; -#define ACHIEVEMENT_MAKE_QUICK_WERK_OF_HIM RAID_MODE(1856, 1857) -#define MAX_ENCOUNTER_TIME 3 * 60 * 1000 +enum +{ + ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT = 10286, +}; struct boss_patchwerkAI : public BossAI { @@ -53,7 +55,13 @@ struct boss_patchwerkAI : public BossAI bool Enraged; - uint32 EncounterTime; + void Reset() + { + _Reset(); + + if (instance) + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); + } void KilledUnit(Unit* /*Victim*/) { @@ -65,31 +73,18 @@ struct boss_patchwerkAI : public BossAI { _JustDied(); DoScriptText(SAY_DEATH, me); - - if (EncounterTime <= MAX_ENCOUNTER_TIME) - { - AchievementEntry const *AchievMakeQuickWerkOfHim = GetAchievementStore()->LookupEntry(ACHIEVEMENT_MAKE_QUICK_WERK_OF_HIM); - if (AchievMakeQuickWerkOfHim) - { - Map *pMap = me->GetMap(); - if (pMap && pMap->IsDungeon()) - { - Map::PlayerList const &players = pMap->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - itr->getSource()->CompletedAchievement(AchievMakeQuickWerkOfHim); - } - } - } } void EnterCombat(Unit * /*who*/) { _EnterCombat(); Enraged = false; - EncounterTime = 0; DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2), me); events.ScheduleEvent(EVENT_HATEFUL, 1200); events.ScheduleEvent(EVENT_BERSERK, 360000); + + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT); } void UpdateAI(const uint32 diff) @@ -99,8 +94,6 @@ struct boss_patchwerkAI : public BossAI events.Update(diff); - EncounterTime += diff; - while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) diff --git a/src/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp b/src/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp index 6b9f2d56b08..bbb1df2731d 100644 --- a/src/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp +++ b/src/scripts/northrend/nexus/eye_of_eternity/boss_malygos.cpp @@ -83,37 +83,54 @@ After all of the NPCs riding on the disks die, the players on the disks need to #define SAY_PHASE3_SLAY_3 -1616027 #define SAY_PHASE3_BIG_ATTACK -1616028 +enum +{ + ACHIEV_TIMED_START_EVENT = 20387, +}; + struct boss_malygosAI : public ScriptedAI { - boss_malygosAI(Creature *c) : ScriptedAI(c) {} + boss_malygosAI(Creature *c) : ScriptedAI(c) + { + instance = me->GetInstanceData(); + } + + InstanceData *instance; - uint32 phase, - enrage; + uint32 phase; + uint32 enrage; void Reset() { - //Source Deadly Boss Mod - enrage = 615000; //10 min + phase = 1; + enrage = 615000; //Source Deadly Boss Mod + + if (instance) + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } + void EnterCombat(Unit* /*who*/) { if (phase == 1) + { DoScriptText(SAY_PHASE1_AGGRO, me); + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } + if (phase == 2) DoScriptText(SAY_PHASE1_AGGRO, me); if (phase == 3) DoScriptText(SAY_PHASE1_AGGRO, me); } - void AttackStart(Unit* /*who*/) {} - void MoveInLineOfSight(Unit* /*who*/) {} + void UpdateAI(const uint32 /*diff*/) { - phase =1; //Return since we have no target if (!UpdateVictim()) return; - if ((me->GetHealth()*100 / me->GetMaxHealth()) <= 50){ + if (phase == 1 && HealthBelowPct(50)) { phase = 2; //spawn adds //set malygos unatackable untill all adds spawned dead @@ -122,10 +139,12 @@ struct boss_malygosAI : public ScriptedAI DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); } + void KilledUnit(Unit * victim) { if (victim == me) diff --git a/src/scripts/northrend/nexus/oculus/boss_drakos.cpp b/src/scripts/northrend/nexus/oculus/boss_drakos.cpp index 6796e399d45..29bbf071386 100644 --- a/src/scripts/northrend/nexus/oculus/boss_drakos.cpp +++ b/src/scripts/northrend/nexus/oculus/boss_drakos.cpp @@ -46,6 +46,11 @@ enum Yells SAY_STOMP_3 = -1578011 }; +enum +{ + ACHIEV_TIMED_START_EVENT = 18153, +}; + struct boss_drakosAI : public ScriptedAI { boss_drakosAI(Creature *c) : ScriptedAI(c), lSummons(me) @@ -81,6 +86,7 @@ struct boss_drakosAI : public ScriptedAI if (pInstance) pInstance->SetData(DATA_DRAKOS_EVENT, IN_PROGRESS); } + void JustSummoned(Creature* summon) { lSummons.Summon(summon); @@ -144,12 +150,17 @@ struct boss_drakosAI : public ScriptedAI DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (pInstance) + { pInstance->SetData(DATA_DRAKOS_EVENT, DONE); + // start achievement timer (kill Eregos within 20 min) + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } } void KilledUnit(Unit * /*victim*/) { diff --git a/src/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp b/src/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp index 5ced0cf0874..f08c19efca2 100644 --- a/src/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp +++ b/src/scripts/northrend/ulduar/halls_of_lightning/boss_loken.cpp @@ -24,34 +24,32 @@ EndScriptData */ #include "ScriptedPch.h" #include "halls_of_lightning.h" -#define MAX_ENCOUNTER_TIME 2 * 60 * 1000 - enum eEnums { - ACHIEVEMENT_TIMELY_DEATH = 1867, - - SAY_AGGRO = -1602018, - SAY_INTRO_1 = -1602019, - SAY_INTRO_2 = -1602020, - SAY_SLAY_1 = -1602021, - SAY_SLAY_2 = -1602022, - SAY_SLAY_3 = -1602023, - SAY_DEATH = -1602024, - SAY_NOVA_1 = -1602025, - SAY_NOVA_2 = -1602026, - SAY_NOVA_3 = -1602027, - SAY_75HEALTH = -1602028, - SAY_50HEALTH = -1602029, - SAY_25HEALTH = -1602030, - EMOTE_NOVA = -1602031, - - SPELL_ARC_LIGHTNING = 52921, - SPELL_LIGHTNING_NOVA_N = 52960, - SPELL_LIGHTNING_NOVA_H = 59835, - - SPELL_PULSING_SHOCKWAVE_N = 52961, - SPELL_PULSING_SHOCKWAVE_H = 59836, - SPELL_PULSING_SHOCKWAVE_AURA = 59414 + ACHIEV_TIMELY_DEATH_START_EVENT = 20384, + + SAY_AGGRO = -1602018, + SAY_INTRO_1 = -1602019, + SAY_INTRO_2 = -1602020, + SAY_SLAY_1 = -1602021, + SAY_SLAY_2 = -1602022, + SAY_SLAY_3 = -1602023, + SAY_DEATH = -1602024, + SAY_NOVA_1 = -1602025, + SAY_NOVA_2 = -1602026, + SAY_NOVA_3 = -1602027, + SAY_75HEALTH = -1602028, + SAY_50HEALTH = -1602029, + SAY_25HEALTH = -1602030, + EMOTE_NOVA = -1602031, + + SPELL_ARC_LIGHTNING = 52921, + SPELL_LIGHTNING_NOVA_N = 52960, + SPELL_LIGHTNING_NOVA_H = 59835, + + SPELL_PULSING_SHOCKWAVE_N = 52961, + SPELL_PULSING_SHOCKWAVE_H = 59836, + SPELL_PULSING_SHOCKWAVE_AURA = 59414 }; /*###### @@ -76,8 +74,6 @@ struct boss_lokenAI : public ScriptedAI uint32 m_uiHealthAmountModifier; - uint32 EncounterTime; - void Reset() { m_bIsAura = false; @@ -90,38 +86,27 @@ struct boss_lokenAI : public ScriptedAI m_uiHealthAmountModifier = 1; if (m_pInstance) + { m_pInstance->SetData(TYPE_LOKEN, NOT_STARTED); + m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); + } } void EnterCombat(Unit* /*pWho*/) { DoScriptText(SAY_AGGRO, me); - EncounterTime = 0; - if (m_pInstance) + { m_pInstance->SetData(TYPE_LOKEN, IN_PROGRESS); + m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT); + } } void JustDied(Unit* /*pKiller*/) { DoScriptText(SAY_DEATH, me); - if (IsHeroic() && EncounterTime <= MAX_ENCOUNTER_TIME) - { - AchievementEntry const *AchievTimelyDeath = GetAchievementStore()->LookupEntry(ACHIEVEMENT_TIMELY_DEATH); - if (AchievTimelyDeath) - { - Map* pMap = me->GetMap(); - if (pMap && pMap->IsDungeon()) - { - Map::PlayerList const &players = pMap->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - itr->getSource()->CompletedAchievement(AchievTimelyDeath); - } - } - } - if (m_pInstance) m_pInstance->SetData(TYPE_LOKEN, DONE); } @@ -137,8 +122,6 @@ struct boss_lokenAI : public ScriptedAI if (!UpdateVictim()) return; - EncounterTime += uiDiff; - if (m_bIsAura) { // workaround for PULSING_SHOCKWAVE diff --git a/src/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp b/src/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp index b3ec294f419..b3c3c675347 100644 --- a/src/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp +++ b/src/scripts/northrend/ulduar/halls_of_stone/boss_maiden_of_grief.cpp @@ -14,29 +14,29 @@ update creature_template set scriptname = 'boss_maiden_of_grief' where entry = ' enum Spells { - SPELL_PARTING_SORROW = 59723, - SPELL_STORM_OF_GRIEF_N = 50752, - SPELL_STORM_OF_GRIEF_H = 59772, - SPELL_SHOCK_OF_SORROW_N = 50760, - SPELL_SHOCK_OF_SORROW_H = 59726, - SPELL_PILLAR_OF_WOE_N = 50761, - SPELL_PILLAR_OF_WOE_H = 59727 + SPELL_PARTING_SORROW = 59723, + SPELL_STORM_OF_GRIEF_N = 50752, + SPELL_STORM_OF_GRIEF_H = 59772, + SPELL_SHOCK_OF_SORROW_N = 50760, + SPELL_SHOCK_OF_SORROW_H = 59726, + SPELL_PILLAR_OF_WOE_N = 50761, + SPELL_PILLAR_OF_WOE_H = 59727 }; enum Yells { - SAY_AGGRO = -1599000, - SAY_SLAY_1 = -1599001, - SAY_SLAY_2 = -1599002, - SAY_SLAY_3 = -1599003, - SAY_SLAY_4 = -1599004, - SAY_DEATH = -1599005, - SAY_STUN = -1599006 + SAY_AGGRO = -1599000, + SAY_SLAY_1 = -1599001, + SAY_SLAY_2 = -1599002, + SAY_SLAY_3 = -1599003, + SAY_SLAY_4 = -1599004, + SAY_DEATH = -1599005, + SAY_STUN = -1599006 }; enum Achievements { - ACHIEVEMENT_GOOD_GRIEF = 1866 + ACHIEV_GOOD_GRIEF_START_EVENT = 20383, }; struct boss_maiden_of_griefAI : public ScriptedAI @@ -52,7 +52,6 @@ struct boss_maiden_of_griefAI : public ScriptedAI uint32 StormOfGriefTimer; uint32 ShockOfSorrowTimer; uint32 PillarOfWoeTimer; - uint32 AchievTimer; void Reset() { @@ -60,10 +59,12 @@ struct boss_maiden_of_griefAI : public ScriptedAI StormOfGriefTimer = 10000; ShockOfSorrowTimer = 20000+rand()%5000; PillarOfWoeTimer = 5000 + rand()%10000; - AchievTimer = 0; if (pInstance) + { pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED); + pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); + } } void EnterCombat(Unit* /*who*/) @@ -80,6 +81,7 @@ struct boss_maiden_of_griefAI : public ScriptedAI } pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, IN_PROGRESS); + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } } @@ -89,11 +91,6 @@ struct boss_maiden_of_griefAI : public ScriptedAI if (!UpdateVictim()) return; - //Achievement counter - if (pInstance) - if (pInstance->GetData(DATA_MAIDEN_OF_GRIEF_EVENT) == IN_PROGRESS) - AchievTimer += diff; - if (IsHeroic()) { if (PartingSorrowTimer <= diff) @@ -135,23 +132,15 @@ struct boss_maiden_of_griefAI : public ScriptedAI DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (pInstance) pInstance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE); - - AchievementEntry const *AchievGoodGrief = GetAchievementStore()->LookupEntry(ACHIEVEMENT_GOOD_GRIEF); - Map* pMap = me->GetMap(); - - if (IsHeroic() && AchievTimer < 60000 && pMap && pMap->IsDungeon() && AchievGoodGrief) - { - Map::PlayerList const &players = pMap->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - itr->getSource()->CompletedAchievement(AchievGoodGrief); - } } + void KilledUnit(Unit * victim) { if (victim == me) diff --git a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp index 1c4c2701731..4a331289044 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_freya.cpp @@ -51,6 +51,20 @@ enum Yells SAY_STONEBARK_DEATH = -1603201, }; +enum +{ + // Con-speed-atory timed achievement. + // TODO Should be started when 1st trash is killed. + ACHIEV_CON_SPEED_ATORY_START_EVENT = 21597, + SPELL_ACHIEVEMENT_CHECK = 65074, + + // Lumberjacked timed achievement. + // TODO should be started when 1st elder is killed. + // Spell should be casted when 3rd elder is killed. + ACHIEV_LUMBERJACKED = 21686, + SPELL_LUMBERJACKED_ACHIEVEMENT_CHECK = 65296, +}; + struct boss_freyaAI : public BossAI { boss_freyaAI(Creature* pCreature) : BossAI(pCreature, TYPE_FREYA) @@ -71,6 +85,10 @@ struct boss_freyaAI : public BossAI { DoScriptText(SAY_DEATH, me); _JustDied(); + + // cast is not rewarding the achievement. + // DoCast(SPELL_ACHIEVEMENT_CHECK); + instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ACHIEVEMENT_CHECK); } void EnterCombat(Unit* /*pWho*/) diff --git a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp index 053b58cbe99..05f9ecd3c66 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_ignis.cpp @@ -36,6 +36,11 @@ enum Yells SAY_BERSERK = -1603228, }; +enum +{ + ACHIEV_TIMED_START_EVENT = 20951, +}; + struct boss_ignis_AI : public BossAI { boss_ignis_AI(Creature *pCreature) : BossAI(pCreature, TYPE_IGNIS) {} @@ -50,12 +55,18 @@ struct boss_ignis_AI : public BossAI uiFlameJetsTimer = 32000; uiScorchTimer = 100; uiSlagPotTimer = 100; + + if (instance) + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void EnterCombat(Unit* /*who*/) { DoScriptText(SAY_AGGRO,me); _EnterCombat(); + + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void KilledUnit(Unit* /*victim*/) diff --git a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp index 1fdfd38c7bf..2080b458a1b 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp @@ -50,6 +50,11 @@ enum Yells SAY_BERSERK = -1603238, }; +enum +{ + ACHIEV_DISARMED_START_EVENT = 21687, +}; + struct boss_kologarnAI : public BossAI { boss_kologarnAI(Creature *pCreature) : BossAI(pCreature, TYPE_KOLOGARN), vehicle(pCreature->GetVehicleKit()), @@ -87,6 +92,10 @@ struct boss_kologarnAI : public BossAI left = apply; else if (who->GetEntry() == 32934) right = apply; + + if (!apply && instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_DISARMED_START_EVENT); + who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); CAST_CRE(who)->SetReactState(REACT_PASSIVE); } diff --git a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp index 7da871758ae..58123951d2f 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_xt002.cpp @@ -126,6 +126,11 @@ enum Yells SAY_SUMMON = -1603308, }; +enum +{ + ACHIEV_TIMED_START_EVENT = 21027, +}; + //#define GRAVITY_BOMB_DMG_MIN_10 11700 //#define GRAVITY_BOMB_DMG_MAX_10 12300 //#define GRAVITY_BOMB_DMG_MIN_25 14625 @@ -213,12 +218,18 @@ struct boss_xt002_AI : public BossAI phase = 1; heart_exposed = 0; + + if (instance) + instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void EnterCombat(Unit* /*who*/) { DoScriptText(SAY_AGGRO, me); _EnterCombat(); + + if (instance) + instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } void DoAction(const int32 action) diff --git a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp index e87b6648e8e..8f42f289204 100644 --- a/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp +++ b/src/scripts/northrend/ulduar/ulduar/boss_yoggsaron.cpp @@ -48,3 +48,8 @@ enum YoggSaron_Yells WHISP_INSANITY_2 = -1603340, SAY_DEATH = -1603341, }; + +enum +{ + ACHIEV_TIMED_START_EVENT = 21001, +}; diff --git a/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp b/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp index 0ccd7a4917b..d1a8dc09c7b 100644 --- a/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp +++ b/src/scripts/northrend/utgarde_keep/utgarde_pinnacle/boss_skadi.cpp @@ -67,6 +67,11 @@ enum CombatPhase SKADI }; +enum +{ + ACHIEV_TIMED_START_EVENT = 17726, +}; + struct boss_skadiAI : public ScriptedAI { boss_skadiAI(Creature *c) : ScriptedAI(c) @@ -101,7 +106,10 @@ struct boss_skadiAI : public ScriptedAI me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if (pInstance) + { pInstance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, NOT_STARTED); + pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } } void EnterCombat(Unit* /*who*/) @@ -116,7 +124,10 @@ struct boss_skadiAI : public ScriptedAI Phase = FLYING; if (pInstance) + { pInstance->SetData(DATA_SKADI_THE_RUTHLESS_EVENT, IN_PROGRESS); + pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); + } } void UpdateAI(const uint32 diff) |