Fix timed achievement checks for boss killed in instance.

Requires DB update.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-04-27 22:26:30 +02:00
parent 36ebd58b37
commit e719bd32a3
17 changed files with 240 additions and 119 deletions
@@ -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,
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,
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_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
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
@@ -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)
@@ -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*/)
@@ -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*/)
@@ -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);
}
@@ -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)
@@ -48,3 +48,8 @@ enum YoggSaron_Yells
WHISP_INSANITY_2 = -1603340,
SAY_DEATH = -1603341,
};
enum
{
ACHIEV_TIMED_START_EVENT = 21001,
};