mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 01:15:35 +01:00
*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,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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user