*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:
@@ -24,8 +24,12 @@ EndScriptData */
|
|||||||
#include "precompiled.h"
|
#include "precompiled.h"
|
||||||
#include "def_nexus.h"
|
#include "def_nexus.h"
|
||||||
|
|
||||||
|
bool DeadChaoticRift; // needed for achievement: Chaos Theory(2037)
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
ACHIEVEMENT_CHAOS_THEORY = 2037,
|
||||||
|
|
||||||
//Spells
|
//Spells
|
||||||
SPELL_SPARK_N = 47751,
|
SPELL_SPARK_N = 47751,
|
||||||
SPELL_SPARK_H = 57062,
|
SPELL_SPARK_H = 57062,
|
||||||
@@ -62,7 +66,6 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
|
|||||||
boss_anomalusAI(Creature *c) : ScriptedAI(c)
|
boss_anomalusAI(Creature *c) : ScriptedAI(c)
|
||||||
{
|
{
|
||||||
pInstance = c->GetInstanceData();
|
pInstance = c->GetInstanceData();
|
||||||
Reset();
|
|
||||||
HeroicMode = c->GetMap()->IsHeroic();
|
HeroicMode = c->GetMap()->IsHeroic();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +84,8 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
|
|||||||
SPELL_CREATE_RIFT_Timer = 25000;
|
SPELL_CREATE_RIFT_Timer = 25000;
|
||||||
ChaoticRiftGUID = 0;
|
ChaoticRiftGUID = 0;
|
||||||
|
|
||||||
|
DeadChaoticRift = false;
|
||||||
|
|
||||||
if(pInstance)
|
if(pInstance)
|
||||||
pInstance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
|
pInstance->SetData(DATA_ANOMALUS_EVENT, NOT_STARTED);
|
||||||
}
|
}
|
||||||
@@ -90,12 +95,33 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
|
|||||||
DoScriptText(SAY_AGGRO, m_creature);
|
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)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (m_creature->HasAura(SPELL_RIFT_SHIELD))
|
if (m_creature->HasAura(SPELL_RIFT_SHIELD))
|
||||||
{
|
{
|
||||||
@@ -187,21 +213,18 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
|
|||||||
|
|
||||||
DoMeleeAttackIfReady();
|
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
|
struct TRINITY_DLL_DECL mob_chaotic_riftAI : public Scripted_NoMovementAI
|
||||||
{
|
{
|
||||||
mob_chaotic_riftAI(Creature *c) : Scripted_NoMovementAI(c)
|
mob_chaotic_riftAI(Creature *c) : Scripted_NoMovementAI(c)
|
||||||
{
|
{
|
||||||
pInstance = c->GetInstanceData();
|
pInstance = c->GetInstanceData();
|
||||||
Reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptedInstance* pInstance;
|
ScriptedInstance* pInstance;
|
||||||
@@ -219,12 +242,15 @@ struct TRINITY_DLL_DECL mob_chaotic_riftAI : public Scripted_NoMovementAI
|
|||||||
DoCast(m_creature, SPELL_ARCANEFORM, false);
|
DoCast(m_creature, SPELL_ARCANEFORM, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JustDied(Unit *killer)
|
||||||
|
{
|
||||||
|
DeadChaoticRift = true;
|
||||||
|
}
|
||||||
|
|
||||||
void UpdateAI(const uint32 diff)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (SPELL_CHAOTIC_ENERGY_BURST_Timer < diff)
|
if (SPELL_CHAOTIC_ENERGY_BURST_Timer < diff)
|
||||||
{
|
{
|
||||||
@@ -257,11 +283,6 @@ CreatureAI* GetAI_mob_chaotic_rift(Creature *_Creature)
|
|||||||
return new mob_chaotic_riftAI (_Creature);
|
return new mob_chaotic_riftAI (_Creature);
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatureAI* GetAI_boss_anomalus(Creature *_Creature)
|
|
||||||
{
|
|
||||||
return new boss_anomalusAI (_Creature);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddSC_boss_anomalus()
|
void AddSC_boss_anomalus()
|
||||||
{
|
{
|
||||||
Script *newscript;
|
Script *newscript;
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ EndScriptData */
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
ACHIEVEMENT_INTENSE_COLD = 2036,
|
||||||
|
|
||||||
//Spells
|
//Spells
|
||||||
SPELL_FROZEN_PRISON = 47854,
|
SPELL_FROZEN_PRISON = 47854,
|
||||||
SPELL_TAIL_SWEEP = 50155,
|
SPELL_TAIL_SWEEP = 50155,
|
||||||
@@ -35,6 +37,7 @@ enum
|
|||||||
SPELL_CRYSTALFIRE_BREATH_H = 57091,
|
SPELL_CRYSTALFIRE_BREATH_H = 57091,
|
||||||
SPELL_CRYSTALIZE = 48179,
|
SPELL_CRYSTALIZE = 48179,
|
||||||
SPELL_INTENSE_COLD = 48094,
|
SPELL_INTENSE_COLD = 48094,
|
||||||
|
SPELL_INTENSE_COLD_TRIGGERED = 48095,
|
||||||
|
|
||||||
//Yell
|
//Yell
|
||||||
SAY_AGGRO = -1576040,
|
SAY_AGGRO = -1576040,
|
||||||
@@ -49,8 +52,7 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
|
|||||||
boss_keristraszaAI(Creature *c) : ScriptedAI(c)
|
boss_keristraszaAI(Creature *c) : ScriptedAI(c)
|
||||||
{
|
{
|
||||||
pInstance = c->GetInstanceData();
|
pInstance = c->GetInstanceData();
|
||||||
HeroicMode = m_creature->GetMap()->IsHeroic();
|
HeroicMode = c->GetMap()->IsHeroic();
|
||||||
Reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ScriptedInstance* pInstance;
|
ScriptedInstance* pInstance;
|
||||||
@@ -61,12 +63,19 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
|
|||||||
uint32 TAIL_SWEEP_Timer;
|
uint32 TAIL_SWEEP_Timer;
|
||||||
bool Enrage;
|
bool Enrage;
|
||||||
|
|
||||||
|
uint32 CheckIntenseColdTimer;
|
||||||
|
bool MoreThanTwoIntenseCold; // needed for achievement: Intense Cold(2036)
|
||||||
|
|
||||||
void Reset()
|
void Reset()
|
||||||
{
|
{
|
||||||
CRYSTALFIRE_BREATH_Timer = 14000;
|
CRYSTALFIRE_BREATH_Timer = 14000;
|
||||||
CRYSTAL_CHAINS_CRYSTALIZE_Timer = HeroicMode ? 30000 : 11000;
|
CRYSTAL_CHAINS_CRYSTALIZE_Timer = HeroicMode ? 30000 : 11000;
|
||||||
TAIL_SWEEP_Timer = 5000;
|
TAIL_SWEEP_Timer = 5000;
|
||||||
Enrage = false;
|
Enrage = false;
|
||||||
|
|
||||||
|
CheckIntenseColdTimer = 2000;
|
||||||
|
MoreThanTwoIntenseCold = false;
|
||||||
|
|
||||||
m_creature->RemoveAurasDueToSpell(SPELL_INTENSE_COLD);
|
m_creature->RemoveAurasDueToSpell(SPELL_INTENSE_COLD);
|
||||||
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
|
||||||
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) == DONE)
|
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) == DONE)
|
||||||
@@ -103,12 +112,54 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
|
|||||||
DoCast(m_creature, SPELL_INTENSE_COLD);
|
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)
|
void UpdateAI(const uint32 diff)
|
||||||
{
|
{
|
||||||
if (!UpdateVictim())
|
if (!UpdateVictim())
|
||||||
{
|
|
||||||
return;
|
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))
|
if (!Enrage && (m_creature->GetHealth() < m_creature->GetMaxHealth() * 0.25))
|
||||||
{
|
{
|
||||||
@@ -142,16 +193,6 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
|
|||||||
|
|
||||||
DoMeleeAttackIfReady();
|
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)
|
CreatureAI* GetAI_boss_keristrasza(Creature *_Creature)
|
||||||
|
|||||||
Reference in New Issue
Block a user