*Implement achievement Chaos Theory, Intense Cold.

*Thanks to Big for the help with testing in the last one. :)

--HG--
branch : trunk
This commit is contained in:
Anubisss
2009-08-10 01:46:53 +02:00
parent 61b4b86d28
commit 1f5bf07bcb
2 changed files with 100 additions and 38 deletions

View File

@@ -24,9 +24,13 @@ EndScriptData */
#include "precompiled.h"
#include "def_nexus.h"
bool DeadChaoticRift; // needed for achievement: Chaos Theory(2037)
enum
{
//Spells
ACHIEVEMENT_CHAOS_THEORY = 2037,
//Spells
SPELL_SPARK_N = 47751,
SPELL_SPARK_H = 57062,
SPELL_RIFT_SHIELD = 47748,
@@ -40,7 +44,7 @@ enum
SPELL_CHARGED_CHAOTIC_ENERGY_BURST = 47737,
SPELL_ARCANEFORM = 48019, //Chaotic Rift visual
//Yell
//Yell
SAY_AGGRO = -1576010,
SAY_DEATH = -1576011,
SAY_RIFT = -1576012,
@@ -62,7 +66,6 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
boss_anomalusAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
Reset();
HeroicMode = c->GetMap()->IsHeroic();
}
@@ -81,6 +84,8 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
SPELL_CREATE_RIFT_Timer = 25000;
ChaoticRiftGUID = 0;
DeadChaoticRift = false;
if(pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
}
@@ -90,13 +95,34 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
DoScriptText(SAY_AGGRO, m_creature);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if(HeroicMode && !DeadChaoticRift)
{
AchievementEntry const *AchievChaosTheory = GetAchievementStore()->LookupEntry(ACHIEVEMENT_CHAOS_THEORY);
if(AchievChaosTheory)
{
Map *map = m_creature->GetMap();
if(map && map->IsDungeon())
{
Map::PlayerList const &players = map->GetPlayers();
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
itr->getSource()->CompletedAchievement(AchievChaosTheory);
}
}
}
if(pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, DONE);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
return;
}
if (m_creature->HasAura(SPELL_RIFT_SHIELD))
{
if (ChaoticRiftGUID)
@@ -187,21 +213,18 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, DONE);
}
};
CreatureAI* GetAI_boss_anomalus(Creature *_Creature)
{
return new boss_anomalusAI (_Creature);
}
struct TRINITY_DLL_DECL mob_chaotic_riftAI : public Scripted_NoMovementAI
{
mob_chaotic_riftAI(Creature *c) : Scripted_NoMovementAI(c)
{
pInstance = c->GetInstanceData();
Reset();
}
ScriptedInstance* pInstance;
@@ -219,12 +242,15 @@ struct TRINITY_DLL_DECL mob_chaotic_riftAI : public Scripted_NoMovementAI
DoCast(m_creature, SPELL_ARCANEFORM, false);
}
void JustDied(Unit *killer)
{
DeadChaoticRift = true;
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
return;
}
if (SPELL_CHAOTIC_ENERGY_BURST_Timer < diff)
{
@@ -257,11 +283,6 @@ CreatureAI* GetAI_mob_chaotic_rift(Creature *_Creature)
return new mob_chaotic_riftAI (_Creature);
}
CreatureAI* GetAI_boss_anomalus(Creature *_Creature)
{
return new boss_anomalusAI (_Creature);
}
void AddSC_boss_anomalus()
{
Script *newscript;

View File

@@ -26,7 +26,9 @@ EndScriptData */
enum
{
//Spells
ACHIEVEMENT_INTENSE_COLD = 2036,
//Spells
SPELL_FROZEN_PRISON = 47854,
SPELL_TAIL_SWEEP = 50155,
SPELL_CRYSTAL_CHAINS = 50997,
@@ -35,8 +37,9 @@ enum
SPELL_CRYSTALFIRE_BREATH_H = 57091,
SPELL_CRYSTALIZE = 48179,
SPELL_INTENSE_COLD = 48094,
SPELL_INTENSE_COLD_TRIGGERED = 48095,
//Yell
//Yell
SAY_AGGRO = -1576040,
SAY_SLAY = -1576041,
SAY_ENRAGE = -1576042,
@@ -49,8 +52,7 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
boss_keristraszaAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
HeroicMode = m_creature->GetMap()->IsHeroic();
Reset();
HeroicMode = c->GetMap()->IsHeroic();
}
ScriptedInstance* pInstance;
@@ -61,12 +63,19 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
uint32 TAIL_SWEEP_Timer;
bool Enrage;
uint32 CheckIntenseColdTimer;
bool MoreThanTwoIntenseCold; // needed for achievement: Intense Cold(2036)
void Reset()
{
CRYSTALFIRE_BREATH_Timer = 14000;
CRYSTAL_CHAINS_CRYSTALIZE_Timer = HeroicMode ? 30000 : 11000;
TAIL_SWEEP_Timer = 5000;
Enrage = false;
CheckIntenseColdTimer = 2000;
MoreThanTwoIntenseCold = false;
m_creature->RemoveAurasDueToSpell(SPELL_INTENSE_COLD);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) == DONE)
@@ -103,13 +112,55 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
DoCast(m_creature, SPELL_INTENSE_COLD);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if(HeroicMode && !MoreThanTwoIntenseCold)
{
AchievementEntry const *AchievIntenseCold = GetAchievementStore()->LookupEntry(ACHIEVEMENT_INTENSE_COLD);
if(AchievIntenseCold)
{
Map *map = m_creature->GetMap();
if(map && map->IsDungeon())
{
Map::PlayerList const &players = map->GetPlayers();
for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
itr->getSource()->CompletedAchievement(AchievIntenseCold);
}
}
}
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_SLAY, m_creature);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
{
return;
}
if(CheckIntenseColdTimer < diff && !MoreThanTwoIntenseCold)
{
std::list<HostilReference*> ThreatList = m_creature->getThreatManager().getThreatList();
for(std::list<HostilReference*>::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); itr++)
{
Unit *target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
if(!target || target->GetTypeId() != TYPEID_PLAYER)
continue;
Aura *AuraIntenseCold = target->GetAura(SPELL_INTENSE_COLD_TRIGGERED);
if(AuraIntenseCold && AuraIntenseCold->GetStackAmount() > 2)
{
MoreThanTwoIntenseCold = true;
break;
}
}
CheckIntenseColdTimer = 2000;
}else CheckIntenseColdTimer -= diff;
if (!Enrage && (m_creature->GetHealth() < m_creature->GetMaxHealth() * 0.25))
{
DoScriptText(SAY_ENRAGE , m_creature);
@@ -142,16 +193,6 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_SLAY, m_creature);
}
};
CreatureAI* GetAI_boss_keristrasza(Creature *_Creature)