aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/boss_dred.cpp50
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/boss_novos.cpp208
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp91
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/boss_trollgore.cpp53
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/def_drak_tharon_keep.h19
-rw-r--r--src/bindings/scripts/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp180
-rw-r--r--src/bindings/scripts/system/ScriptLoader.cpp4
7 files changed, 510 insertions, 95 deletions
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_dred.cpp b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_dred.cpp
index 98425a29e1a..ae9e4900f3d 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_dred.cpp
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_dred.cpp
@@ -10,25 +10,40 @@ Script Data End */
update creature_template set scriptname = '' where entry = '';
*** SQL END ***/
#include "precompiled.h"
+#include "def_drak_tharon_keep.h"
-//Spells
-#define SPELL_BELLOWING_ROAR 44863 // fears the group, can be resisted/dispelled
-#define SPELL_GRIEVOUS_BITE 48920
-#define SPELL_MANGLING_SLASH 48873 //casted on the current tank, adds debuf
-#define SPELL_FEARSOME_ROAR_N 48849
-#define SPELL_FEARSOME_ROAR_H 48849 //Not stacking, debuff
-#define SPELL_PIERCING_SLASH 48878 //debuff -->Armor reduced by 75%
-#define SPELL_RAPTOR_CALL 59416 //dummy
-
+enum Spells
+{
+ SPELL_BELLOWING_ROAR = 44863, // fears the group, can be resisted/dispelled
+ SPELL_GRIEVOUS_BITE = 48920,
+ SPELL_MANGLING_SLASH = 48873, //casted on the current tank, adds debuf
+ SPELL_FEARSOME_ROAR = 48849,
+ H_SPELL_FEARSOME_ROAR = 48849, //Not stacking, debuff
+ SPELL_PIERCING_SLASH = 48878, //debuff -->Armor reduced by 75%
+ SPELL_RAPTOR_CALL = 59416 //dummy
+};
struct TRINITY_DLL_DECL boss_dredAI : public ScriptedAI
{
- boss_dredAI(Creature *c) : ScriptedAI(c) {}
+ boss_dredAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
- void Reset() {}
- void EnterCombat(Unit* who) {}
- void AttackStart(Unit* who) {}
- void MoveInLineOfSight(Unit* who) {}
+ void Reset()
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_DRED_EVENT,NOT_STARTED);
+ }
+
+ void EnterCombat(Unit* who)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_DRED_EVENT,IN_PROGRESS);
+ }
+
void UpdateAI(const uint32 diff)
{
//Return since we have no target
@@ -37,7 +52,12 @@ struct TRINITY_DLL_DECL boss_dredAI : public ScriptedAI
DoMeleeAttackIfReady();
}
- void JustDied(Unit* killer) {}
+
+ void JustDied(Unit* killer)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_DRED_EVENT,DONE);
+ }
};
CreatureAI* GetAI_boss_dred(Creature* pCreature)
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_novos.cpp b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_novos.cpp
index 3fa867bdded..2035ff1f4f3 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_novos.cpp
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_novos.cpp
@@ -10,54 +10,192 @@ Script Data End */
update creature_template set scriptname = 'boss_novos' where entry = '';
*** SQL END ***/
#include "precompiled.h"
+#include "def_drak_tharon_keep.h"
-//Spells
-#define SPELL_ARCANE_BLAST_N 49198
-#define SPELL_ARCANE_BLAST_H 59909
-#define SPELL_ARCANE_FIELD 47346
-#define SPELL_BLIZZARD_N 49034
-#define SPELL_BLIZZARD_H 59854
-#define SPELL_FROSTBOLT_N 49037
-#define SPELL_FROSTBOLT_H 59855
-#define SPELL_WRATH_OF_MISERY_N 50089
-#define SPELL_WRATH_OF_MISERY_H 59856
-#define SPELL_SUMMON_MINIONS 59910 //Summons an army of Fetid Troll Corpses to assist the caster.
-
+enum Spells
+{
+ SPELL_ARCANE_BLAST = 49198,
+ H_SPELL_ARCANE_BLAST = 59909,
+ SPELL_ARCANE_FIELD = 47346,
+ SPELL_BLIZZARD = 49034,
+ H_SPELL_BLIZZARD = 59854,
+ SPELL_FROSTBOLT = 49037,
+ H_SPELL_FROSTBOLT = 59855,
+ SPELL_WRATH_OF_MISERY = 50089,
+ H_SPELL_WRATH_OF_MISERY = 59856,
+ SPELL_SUMMON_MINIONS = 59910 //Summons an army of Fetid Troll Corpses to assist the caster.
+};
//not in db
-//Yell
-#define SAY_AGGRO -1600000
-#define SAY_KILL -1600001
-#define SAY_DEATH -1600002
-#define SAY_NECRO_ADD -1600003
-#define SAY_REUBBLE_1 -1600004
-#define SAY_REUBBLE_2 -1600005
+enum Yells
+{
+ SAY_AGGRO = -1600000,
+ SAY_KILL = -1600001,
+ SAY_DEATH = -1600002,
+ SAY_NECRO_ADD = -1600003,
+ SAY_REUBBLE_1 = -1600004,
+ SAY_REUBBLE_2 = -1600005
+};
+enum Creatures
+{
+ CREATURE_RISEN_SHADOWCASTER = 27600,
+ CREATURE_FETID_TROLL_CORPSE = 27598,
+ CREATURE_HULKING_CORPSE = 27597,
+ CREATURE_CRYSTAL_HANDLER = 26627
+};
+enum CombatPhase
+{
+ IDLE,
+ PHASE_1,
+ PHASE_2
+};
-struct TRINITY_DLL_DECL boss_novosAI : public ScriptedAI
+struct Location
{
- boss_novosAI(Creature *c) : ScriptedAI(c) {}
+ float x,y,z;
+};
+
+static Location AddSpawnPoint = { -379.20, -816.76, 59.70};
- void Reset() {}
+struct TRINITY_DLL_DECL boss_novosAI : public Scripted_NoMovementAI
+{
+ boss_novosAI(Creature *c) : Scripted_NoMovementAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ Reset();
+ }
+
+ uint32 uiTimer;
+ uint32 uiCrystalHandlerTimer;
+
+ std::list<uint64> luiCrystals;
+
+ CombatPhase Phase;
+
+ ScriptedInstance* pInstance;
+
+ void Reset()
+ {
+ Phase = IDLE;
+ luiCrystals.clear();
+ if (pInstance)
+ {
+ pInstance->SetData(DATA_NOVOS_EVENT, NOT_STARTED);
+ luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_1));
+ luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_2));
+ luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_3));
+ luiCrystals.push_back(pInstance->GetData64(DATA_NOVOS_CRYSTAL_4));
+ for (std::list<uint64>::iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
+ {
+ if (GameObject* pTemp = pInstance->instance->GetGameObject(*itr))
+ pTemp->SetGoState(GO_STATE_READY);
+ }
+ }
+ }
+
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
+ Phase = PHASE_1;
+ uiCrystalHandlerTimer = 30000;
+ uiTimer = 1000;
+ DoCast(m_creature,SPELL_ARCANE_FIELD);
+ if (pInstance)
+ {
+ for (std::list<uint64>::iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr)
+ {
+ if (GameObject *pTemp = pInstance->instance->GetGameObject(*itr))
+ pTemp->SetGoState(GO_STATE_ACTIVE);
+ }
+ pInstance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS);
+ }
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
- void AttackStart(Unit* who) {}
- void MoveInLineOfSight(Unit* who) {}
+
void UpdateAI(const uint32 diff)
{
- //Return since we have no target
- if (!UpdateVictim())
- return;
-
- DoMeleeAttackIfReady();
+ switch (Phase)
+ {
+ case PHASE_1:
+ if (uiTimer < diff)
+ {
+ Creature *pSummon = m_creature->SummonCreature(RAND(CREATURE_FETID_TROLL_CORPSE,CREATURE_HULKING_CORPSE,CREATURE_RISEN_SHADOWCASTER), AddSpawnPoint.x, AddSpawnPoint.y , AddSpawnPoint.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
+ pSummon->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(), m_creature->GetPositionY() , m_creature->GetPositionZ());
+ //If spell is casted stops casting arcane field so no spell casting
+ //DoCast(m_creature,SPELL_SUMMON_MINIONS);
+ uiTimer = 3000;
+ } else uiTimer -= diff;
+ if (uiCrystalHandlerTimer < diff)
+ {
+ //TODO: say
+ Creature *pCrystalHandler = m_creature->SummonCreature(CREATURE_CRYSTAL_HANDLER, AddSpawnPoint.x, AddSpawnPoint.y , AddSpawnPoint.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN,20000);
+ pCrystalHandler->GetMotionMaster()->MovePoint(0, m_creature->GetPositionX(), m_creature->GetPositionY() , m_creature->GetPositionZ());
+ uiCrystalHandlerTimer = 20000+rand()%10000;
+ } else uiCrystalHandlerTimer -= diff;
+ break;
+ case PHASE_2:
+ if (uiTimer < diff)
+ {
+ Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
+ while (pTarget && pTarget->GetTypeId() != TYPEID_PLAYER)
+ pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
+ if (pTarget)
+ DoCast(pTarget, HeroicMode ? RAND(H_SPELL_ARCANE_BLAST,H_SPELL_BLIZZARD,H_SPELL_FROSTBOLT,H_SPELL_WRATH_OF_MISERY) :
+ RAND(SPELL_ARCANE_BLAST,SPELL_BLIZZARD,SPELL_FROSTBOLT,SPELL_WRATH_OF_MISERY));
+ uiTimer = 1000 + rand()%2000;
+ } else uiTimer -= diff;
+ break;
+ }
+ }
+ void JustDied(Unit* killer)
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_NOVOS_EVENT, DONE);
}
- void JustDied(Unit* killer) {}
+
void KilledUnit(Unit *victim)
{
if (victim == m_creature)
return;
DoScriptText(SAY_KILL, m_creature);
}
+
+ void RemoveCrystal()
+ {
+ if (!luiCrystals.empty())
+ {
+ if (pInstance)
+ if (GameObject *pTemp = pInstance->instance->GetGameObject(luiCrystals.back()))
+ pTemp->SetGoState(GO_STATE_READY);
+ luiCrystals.pop_back();
+ }
+ if (luiCrystals.empty())
+ {
+ m_creature->CastStop();
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
+ m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ Phase = PHASE_2;
+ uiTimer = 1000;
+ }
+ }
+};
+
+struct TRINITY_DLL_DECL mob_crystal_handlerAI : public ScriptedAI
+{
+ mob_crystal_handlerAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance *pInstance;
+
+ void JustDied(Unit* killer)
+ {
+ if (Creature* pNovos = Unit::GetCreature(*m_creature, pInstance ? pInstance->GetData64(DATA_NOVOS) : 0))
+ CAST_AI(boss_novosAI,pNovos->AI())->RemoveCrystal();
+ }
};
CreatureAI* GetAI_boss_novos(Creature* pCreature)
@@ -65,6 +203,11 @@ CreatureAI* GetAI_boss_novos(Creature* pCreature)
return new boss_novosAI (pCreature);
}
+CreatureAI* GetAI_mob_crystal_handler(Creature* pCreature)
+{
+ return new mob_crystal_handlerAI (pCreature);
+}
+
void AddSC_boss_novos()
{
Script *newscript;
@@ -73,4 +216,9 @@ void AddSC_boss_novos()
newscript->Name="boss_novos";
newscript->GetAI = &GetAI_boss_novos;
newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="mob_crystal_handler";
+ newscript->GetAI = &GetAI_mob_crystal_handler;
+ newscript->RegisterSelf();
}
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp
index 6ba178c48fc..e5b18a879b4 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_tharon_ja.cpp
@@ -10,52 +10,70 @@ Script Data End */
update creature_template set scriptname = 'boss_tharon_ja' where entry = '';
*** SQL END ***/
#include "precompiled.h"
+#include "def_drak_tharon_keep.h"
-//Spells
-#define SPELL_COURSE_OF_LIFE 49527
-#define SPELL_DECAY_FLESH 49356 //casted at end of pahase 1, starts phase 2
-#define SPELL_EYE_BEAM_N 49544
-#define SPELL_LIGHTNING_BREATH_N 49537
-#define SPELL_POISON_CLOUD_N 49548
-#define SPELL_RAIN_OF_FIRE_N 49518
-#define SPELL_RETURN_FLESH 53463 //Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
-#define SPELL_SHADOW_VOLLEY_N 49528
-
+enum Spells
+{
+ SPELL_COURSE_OF_LIFE = 49527,
+ SPELL_DECAY_FLESH = 49356, //casted at end of pahase 1, starts phase 2
+ SPELL_EYE_BEAM = 49544,
+ SPELL_LIGHTNING_BREATH = 49537,
+ SPELL_POISON_CLOUD = 49548,
+ SPELL_RAIN_OF_FIRE = 49518,
+ SPELL_RETURN_FLESH = 53463, //Channeled spell ending phase two and returning to phase 1. This ability will stun the party for 6 seconds.
+ SPELL_SHADOW_VOLLEY = 49528,
//Spells Heroic
-#define SPELL_COURSE_OF_LIFE_H 59972
-#define SPELL_EYE_BEAM_H 59965
-#define SPELL_LIGHTNING_BREATH_H 59963
-#define SPELL_POISON_CLOUD_H 59969
-#define SPELL_RAIN_OF_FIRE_H 59971
-#define SPELL_SHADOW_VOLLEY_H 59973
-
+ H_SPELL_COURSE_OF_LIFE = 59972,
+ H_SPELL_EYE_BEAM = 59965,
+ H_SPELL_LIGHTNING_BREATH = 59963,
+ H_SPELL_POISON_CLOUD = 59969,
+ H_SPELL_RAIN_OF_FIRE = 59971,
+ H_SPELL_SHADOW_VOLLEY = 59973
+};
+enum PlayerSkills
+{
//Players skills durring Phase2
-#define PLAYER_PHASE2_SLAYING_STRIKE 50799
-#define PLAYER_PHASE2_TAUNT 49613
-#define PLAYER_PHASE2_BONE_ARMOR 49609
-#define PLAYER_PHASE2_TOUCH_OF_LIFE 49617
+ PLAYER_PHASE2_SLAYING_STRIKE = 50799,
+ PLAYER_PHASE2_TAUNT = 49613,
+ PLAYER_PHASE2_BONE_ARMOR = 49609,
+ PLAYER_PHASE2_TOUCH_OF_LIFE = 49617
+};
//Phase 1 all abilities except Eye beam
//Phase 2 turns players to skeletons with new abilities, boss grows skin
//not in db
-//Yell
-#define SAY_AGGRO -1600011
-#define SAY_KILL_1 -1600012
-#define SAY_KILL_2 -1600013
-#define SAY_FLESH_1 -1600014
-#define SAY_FLESH_2 -1600015
-#define SAY_SKELETON_1 -1600016
-#define SAY_SKELETON_2 -1600017
-#define SAY_DEATH -1600018
+enum Yells
+{
+ SAY_AGGRO = -1600011,
+ SAY_KILL_1 = -1600012,
+ SAY_KILL_2 = -1600013,
+ SAY_FLESH_1 = -1600014,
+ SAY_FLESH_2 = -1600015,
+ SAY_SKELETON_1 = -1600016,
+ SAY_SKELETON_2 = -1600017,
+ SAY_DEATH = -1600018
+};
struct TRINITY_DLL_DECL boss_tharon_jaAI : public ScriptedAI
{
- boss_tharon_jaAI(Creature *c) : ScriptedAI(c) {}
+ boss_tharon_jaAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
- void Reset() {}
+ void Reset()
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_THARON_JA_EVENT, NOT_STARTED);
+ }
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
+
+ if (pInstance)
+ pInstance->SetData(DATA_THARON_JA_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* who) {}
void MoveInLineOfSight(Unit* who) {}
@@ -67,9 +85,18 @@ struct TRINITY_DLL_DECL boss_tharon_jaAI : public ScriptedAI
DoMeleeAttackIfReady();
}
+
+ void KilledUnit(Unit *victim)
+ {
+ DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2),m_creature);
+ }
+
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH,m_creature);
+
+ if (pInstance)
+ pInstance->SetData(DATA_THARON_JA_EVENT, DONE);
}
};
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_trollgore.cpp b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_trollgore.cpp
index 194ef136f7e..c8397840ef7 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_trollgore.cpp
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/boss_trollgore.cpp
@@ -10,33 +10,49 @@ Script Data End */
update creature_template set scriptname = 'boss_trollgore' where entry = '';
*** SQL END ***/
#include "precompiled.h"
+#include "def_drak_tharon_keep.h"
-//Spell
-#define SPELL_INFECTED_WOUND 49637
-#define SPELL_CRUSH 49639
-#define SPELL_CORPSE_EXPLODE_N 49555
-#define SPELL_CONSUME_N 49380
-
+enum Spells
+{
+ SPELL_INFECTED_WOUND = 49637,
+ SPELL_CRUSH = 49639,
+ SPELL_CORPSE_EXPLODE = 49555,
+ SPELL_CONSUME = 49380,
//Spell Heroic
-#define SPELL_CORPSE_EXPLODE_H 59807
-#define SPELL_CONSUME_H 59803
-
+ H_SPELL_CORPSE_EXPLODE = 59807,
+ H_SPELL_CONSUME = 59803
+};
//not in db
-//Yell
-#define SAY_AGGRO -1600006
-#define SAY_KILL -1600007
-#define SAY_CONSUME -1600008
-#define SAY_EXPLODE -1600009
-#define SAY_DEATH -1600010
+enum Yells
+{
+ SAY_AGGRO = -1600006,
+ SAY_KILL = -1600007,
+ SAY_CONSUME = -1600008,
+ SAY_EXPLODE = -1600009,
+ SAY_DEATH = -1600010
+};
struct TRINITY_DLL_DECL boss_trollgoreAI : public ScriptedAI
{
- boss_trollgoreAI(Creature *c) : ScriptedAI(c) {}
+ boss_trollgoreAI(Creature *c) : ScriptedAI(c)
+ {
+ pInstance = c->GetInstanceData();
+ }
+
+ ScriptedInstance* pInstance;
- void Reset() {}
+ void Reset()
+ {
+ if (pInstance)
+ pInstance->SetData(DATA_TROLLGORE_EVENT, NOT_STARTED);
+ }
+
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
+
+ if (pInstance)
+ pInstance->SetData(DATA_TROLLGORE_EVENT, IN_PROGRESS);
}
void AttackStart(Unit* who) {}
void MoveInLineOfSight(Unit* who) {}
@@ -51,6 +67,9 @@ struct TRINITY_DLL_DECL boss_trollgoreAI : public ScriptedAI
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
+
+ if (pInstance)
+ pInstance->SetData(DATA_TROLLGORE_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/def_drak_tharon_keep.h b/src/bindings/scripts/scripts/northrend/draktharon_keep/def_drak_tharon_keep.h
index 321d77a9c27..89f350c1a47 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/def_drak_tharon_keep.h
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/def_drak_tharon_keep.h
@@ -1,4 +1,21 @@
#ifndef DEF_DRAK_THARON_H
#define DEF_DRAK_THARON_H
-
+enum Data
+{
+ DATA_TROLLGORE_EVENT,
+ DATA_NOVOS_EVENT,
+ DATA_DRED_EVENT,
+ DATA_THARON_JA_EVENT
+};
+enum Data64
+{
+ DATA_TROLLGORE,
+ DATA_NOVOS,
+ DATA_DRED,
+ DATA_THARON_JA,
+ DATA_NOVOS_CRYSTAL_1,
+ DATA_NOVOS_CRYSTAL_2,
+ DATA_NOVOS_CRYSTAL_3,
+ DATA_NOVOS_CRYSTAL_4
+};
#endif
diff --git a/src/bindings/scripts/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp b/src/bindings/scripts/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp
index 795f36eca18..6c88104b1e3 100644
--- a/src/bindings/scripts/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp
+++ b/src/bindings/scripts/scripts/northrend/draktharon_keep/instance_drak_tharon_keep.cpp
@@ -1,9 +1,189 @@
#include "precompiled.h"
#include "def_drak_tharon_keep.h"
+#define MAX_ENCOUNTER 4
+/* Drak'Tharon Keep encounters:
+0 - Trollgore
+1 - Novos
+2 - King Dred
+3 - Tharon Ja
+*/
+
struct TRINITY_DLL_DECL instance_drak_tharon : public ScriptedInstance
{
instance_drak_tharon(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
+
+ uint64 uiTrollgore;
+ uint64 uiNovos;
+ uint64 uiDred;
+ uint64 uiTharonJa;
+
+ uint64 uiNovosCrystal1;
+ uint64 uiNovosCrystal2;
+ uint64 uiNovosCrystal3;
+ uint64 uiNovosCrystal4;
+
+ uint8 m_auiEncounter[MAX_ENCOUNTER];
+
+ std::string str_data;
+
+ void Initialize()
+ {
+ uiTrollgore = 0;
+ uiNovos = 0;
+ uiDred = 0;
+ uiTharonJa = 0;
+ uiNovosCrystal1 = 0;
+ uiNovosCrystal2 = 0;
+ uiNovosCrystal3 = 0;
+ uiNovosCrystal4 = 0;
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS) return true;
+
+ return false;
+ }
+
+ void OnGameObjectCreate(GameObject* pGo, bool add)
+ {
+ switch(pGo->GetEntry())
+ {
+ case 189299:
+ uiNovosCrystal1 = pGo->GetGUID();
+ break;
+ case 189300:
+ uiNovosCrystal2 = pGo->GetGUID();
+ break;
+ case 189301:
+ uiNovosCrystal3 = pGo->GetGUID();
+ break;
+ case 189302:
+ uiNovosCrystal4 = pGo->GetGUID();
+ break;
+ }
+ }
+
+ void OnCreatureCreate(Creature* pCreature, bool add)
+ {
+ switch(pCreature->GetEntry())
+ {
+ case 26630:
+ uiTrollgore = pCreature->GetGUID();
+ break;
+ case 26631:
+ uiNovos = pCreature->GetGUID();
+ break;
+ case 27483:
+ uiTrollgore = pCreature->GetGUID();
+ break;
+ case 26632:
+ uiTharonJa = pCreature->GetGUID();
+ break;
+ }
+ }
+
+ uint64 GetData64(uint32 identifier)
+ {
+ switch(identifier)
+ {
+ case DATA_TROLLGORE: return uiTrollgore;
+ case DATA_NOVOS: return uiNovos;
+ case DATA_DRED: return uiDred;
+ case DATA_THARON_JA: return uiTharonJa;
+ case DATA_NOVOS_CRYSTAL_1: return uiNovosCrystal1;
+ case DATA_NOVOS_CRYSTAL_2: return uiNovosCrystal2;
+ case DATA_NOVOS_CRYSTAL_3: return uiNovosCrystal3;
+ case DATA_NOVOS_CRYSTAL_4: return uiNovosCrystal4;
+ }
+
+ return 0;
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ switch(type)
+ {
+ case DATA_TROLLGORE_EVENT:
+ m_auiEncounter[0] = data;
+ break;
+ case DATA_NOVOS_EVENT:
+ m_auiEncounter[1] = data;
+ break;
+ case DATA_DRED_EVENT:
+ m_auiEncounter[2] = data;
+ break;
+ case DATA_THARON_JA_EVENT:
+ m_auiEncounter[3] = data;
+ break;
+ }
+
+ if (data == DONE)
+ {
+ SaveToDB();
+ }
+ }
+
+ uint32 GetData(uint32 type)
+ {
+ switch(type)
+ {
+ case DATA_TROLLGORE_EVENT: return m_auiEncounter[0];
+ case DATA_NOVOS_EVENT: return m_auiEncounter[1];
+ case DATA_DRED_EVENT: return m_auiEncounter[2];
+ case DATA_THARON_JA_EVENT: return m_auiEncounter[3];
+ }
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::string str_data;
+
+ std::ostringstream saveStream;
+ saveStream << "D K " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
+ << m_auiEncounter[2] << " " << m_auiEncounter[3];
+
+ str_data = saveStream.str();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return str_data;
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(in);
+
+ char dataHead1, dataHead2;
+ uint16 data0,data1,data2,data3,data4, data5, data6;
+
+ std::istringstream loadStream(in);
+ loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
+
+ if (dataHead1 == 'D' && dataHead2 == 'K')
+ {
+ m_auiEncounter[0] = data0;
+ m_auiEncounter[1] = data1;
+ m_auiEncounter[2] = data2;
+ m_auiEncounter[3] = data3;
+ m_auiEncounter[4] = data4;
+
+ for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS)
+ m_auiEncounter[i] = NOT_STARTED;
+ }else OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
};
InstanceData* GetInstanceData_instance_drak_tharon(Map* pMap)
diff --git a/src/bindings/scripts/system/ScriptLoader.cpp b/src/bindings/scripts/system/ScriptLoader.cpp
index 977cb40c45a..78087da9629 100644
--- a/src/bindings/scripts/system/ScriptLoader.cpp
+++ b/src/bindings/scripts/system/ScriptLoader.cpp
@@ -327,6 +327,8 @@ extern void AddSC_utgarde_keep();
extern void AddSC_boss_archavon(); //Vault of Archavon
extern void AddSC_boss_emalon();
extern void AddSC_instance_archavon();
+extern void AddSC_boss_novos(); //Drak'Tharon Keep
+extern void AddSC_instance_drak_tharon();
extern void AddSC_borean_tundra();
extern void AddSC_dragonblight();
@@ -746,6 +748,8 @@ void AddScripts()
AddSC_boss_archavon(); //Vault of Archavon
AddSC_boss_emalon();
AddSC_instance_archavon();
+ AddSC_boss_novos(); //Drak'Tharon Keep
+ AddSC_instance_drak_tharon();
AddSC_borean_tundra();
AddSC_dragonblight();