aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp78
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp30
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp330
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp64
-rw-r--r--src/server/scripts/EasternKingdoms/Uldaman/uldaman.h14
5 files changed, 386 insertions, 130 deletions
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
index 9d899007c56..e77c31ecaf8 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_archaedas.cpp
@@ -27,6 +27,7 @@ On his death the vault door opens.
EndScriptData */
#include "ScriptPCH.h"
+#include "uldaman.h"
#define SAY_AGGRO "Who dares awaken Archaedas? Who dares the wrath of the makers!"
#define SOUND_AGGRO 5855
@@ -67,10 +68,10 @@ class boss_archaedas : public CreatureScript
pInstance = me->GetInstanceScript();
}
- uint32 Tremor_Timer;
- int32 Awaken_Timer;
+ uint32 uiTremorTimer;
+ int32 iAwakenTimer;
uint32 WallMinionTimer;
- bool wakingUp;
+ bool bWakingUp;
bool guardiansAwake;
bool vaultWalkersAwake;
@@ -78,11 +79,11 @@ class boss_archaedas : public CreatureScript
void Reset()
{
- Tremor_Timer = 60000;
- Awaken_Timer = 0;
+ uiTremorTimer = 60000;
+ iAwakenTimer = 0;
WallMinionTimer = 10000;
- wakingUp = false;
+ bWakingUp = false;
guardiansAwake = false;
vaultWalkersAwake = false;
@@ -117,8 +118,8 @@ class boss_archaedas : public CreatureScript
if (spell == GetSpellStore()->LookupEntry(SPELL_ARCHAEDAS_AWAKEN)) {
me->MonsterYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(me,SOUND_AGGRO);
- Awaken_Timer = 4000;
- wakingUp = true;
+ iAwakenTimer = 4000;
+ bWakingUp = true;
}
}
@@ -133,11 +134,11 @@ class boss_archaedas : public CreatureScript
if (!pInstance)
return;
// we're still doing awaken animation
- if (wakingUp && Awaken_Timer >= 0) {
- Awaken_Timer -= diff;
+ if (bWakingUp && iAwakenTimer >= 0) {
+ iAwakenTimer -= diff;
return; // dont do anything until we are done
- } else if (wakingUp && Awaken_Timer <= 0) {
- wakingUp = false;
+ } else if (bWakingUp && iAwakenTimer <= 0) {
+ bWakingUp = false;
AttackStart(Unit::GetUnit(*me, pInstance->GetData64(0)));
return; // dont want to continue until we finish the AttackStart method
}
@@ -148,7 +149,7 @@ class boss_archaedas : public CreatureScript
// wake a wall minion
if (WallMinionTimer <= diff) {
- pInstance->SetData (NULL, 2);
+ pInstance->SetData (DATA_MINIONS, IN_PROGRESS);
WallMinionTimer = 10000;
} else WallMinionTimer -= diff;
@@ -177,14 +178,14 @@ class boss_archaedas : public CreatureScript
vaultWalkersAwake = true;
}
- if (Tremor_Timer <= diff)
+ if (uiTremorTimer <= diff)
{
//Cast
DoCast(me->getVictim(), SPELL_GROUND_TREMOR);
//45 seconds until we should cast this agian
- Tremor_Timer = 45000;
- } else Tremor_Timer -= diff;
+ uiTremorTimer = 45000;
+ } else uiTremorTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -192,8 +193,8 @@ class boss_archaedas : public CreatureScript
void JustDied (Unit * /*pKiller*/) {
if (pInstance)
{
- pInstance->SetData(NULL,3); // open the vault door
- pInstance->SetData(NULL,4); // deactivate his minions
+ pInstance->SetData(DATA_ANCIENT_DOOR, DONE); // open the vault door
+ pInstance->SetData(DATA_MINIONS, SPECIAL); // deactivate his minions
}
}
};
@@ -229,20 +230,20 @@ class mob_archaedas_minions : public CreatureScript
pInstance = me->GetInstanceScript();
}
- uint32 Arcing_Timer;
- int32 Awaken_Timer;
- bool wakingUp;
+ uint32 uiArcing_Timer;
+ int32 iAwakenTimer;
+ bool bWakingUp;
- bool amIAwake;
+ bool bAmIAwake;
InstanceScript* pInstance;
void Reset()
{
- Arcing_Timer = 3000;
- Awaken_Timer = 0;
+ uiArcing_Timer = 3000;
+ iAwakenTimer = 0;
- wakingUp = false;
- amIAwake = false;
+ bWakingUp = false;
+ bAmIAwake = false;
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -256,32 +257,32 @@ class mob_archaedas_minions : public CreatureScript
me->RemoveAllAuras();
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
- amIAwake = true;
+ bAmIAwake = true;
}
void SpellHit (Unit* /*caster*/, const SpellEntry *spell) {
// time to wake up, start animation
if (spell == GetSpellStore()->LookupEntry(SPELL_ARCHAEDAS_AWAKEN)){
- Awaken_Timer = 5000;
- wakingUp = true;
+ iAwakenTimer = 5000;
+ bWakingUp = true;
}
}
void MoveInLineOfSight(Unit *who)
{
- if (amIAwake)
+ if (bAmIAwake)
ScriptedAI::MoveInLineOfSight(who);
}
void UpdateAI(const uint32 diff)
{
// we're still in the awaken animation
- if (wakingUp && Awaken_Timer >= 0) {
- Awaken_Timer -= diff;
+ if (bWakingUp && iAwakenTimer >= 0) {
+ iAwakenTimer -= diff;
return; // dont do anything until we are done
- } else if (wakingUp && Awaken_Timer <= 0) {
- wakingUp = false;
- amIAwake = true;
+ } else if (bWakingUp && iAwakenTimer <= 0) {
+ bWakingUp = false;
+ bAmIAwake = true;
// AttackStart(Unit::GetUnit(*me, pInstance->GetData64(0))); // whoWokeArchaedasGUID
return; // dont want to continue until we finish the AttackStart method
}
@@ -355,7 +356,7 @@ class mob_stonekeepers : public CreatureScript
{
DoCast (me, SPELL_SELF_DESTRUCT,true);
if (pInstance)
- pInstance->SetData(NULL, 1); // activate next stonekeeper
+ pInstance->SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate next stonekeeper
}
};
@@ -383,7 +384,7 @@ class go_altar_of_archaedas : public GameObjectScript
{
}
- bool OnGossipHello(Player* pPlayer, GameObject* /*pGo*/)
+ bool OnGossipHello(Player* pPlayer, GameObject* /*pGO*/)
{
InstanceScript* pInstance = pPlayer->GetInstanceScript();
if (!pInstance)
@@ -391,7 +392,6 @@ class go_altar_of_archaedas : public GameObjectScript
pPlayer->CastSpell (pPlayer, SPELL_BOSS_OBJECT_VISUAL, false);
- pInstance->SetData(NULL,0);
pInstance->SetData64(0,pPlayer->GetGUID()); // activate archaedas
return false;
}
@@ -423,7 +423,7 @@ class go_altar_of_the_keepers : public GameObjectScript
pPlayer->CastSpell (pPlayer, SPELL_BOSS_OBJECT_VISUAL, false);
- pInstance->SetData(NULL,1); // activate the Stone Keepers
+ pInstance->SetData(DATA_STONE_KEEPERS, IN_PROGRESS); // activate the Stone Keepers
return false;
}
};
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
index 5b9ce931cd1..161d043d35a 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/boss_ironaya.cpp
@@ -44,15 +44,15 @@ class boss_ironaya : public CreatureScript
{
boss_ironayaAI(Creature *c) : ScriptedAI(c) {}
- uint32 Arcing_Timer;
- bool hasCastedWstomp;
- bool hasCastedKnockaway;
+ uint32 uiArcingTimer;
+ bool bHasCastedWstomp;
+ bool bHasCastedKnockaway;
void Reset()
{
- Arcing_Timer = 3000;
- hasCastedKnockaway = false;
- hasCastedWstomp = false;
+ uiArcingTimer = 3000;
+ bHasCastedKnockaway = false;
+ bHasCastedWstomp = false;
}
void EnterCombat(Unit * /*who*/)
@@ -67,7 +67,7 @@ class boss_ironaya : public CreatureScript
return;
//If we are <50% hp do knockaway ONCE
- if (!hasCastedKnockaway && HealthBelowPct(50))
+ if (!bHasCastedKnockaway && HealthBelowPct(50))
{
DoCast(me->getVictim(), SPELL_KNOCKAWAY, true);
@@ -81,20 +81,20 @@ class boss_ironaya : public CreatureScript
me->TauntApply(Target);
//Shouldn't cast this agian
- hasCastedKnockaway = true;
+ bHasCastedKnockaway = true;
}
- //Arcing_Timer
- if (Arcing_Timer <= diff)
+ //uiArcingTimer
+ if (uiArcingTimer <= diff)
{
DoCast(me, SPELL_ARCINGSMASH);
- Arcing_Timer = 13000;
- } else Arcing_Timer -= diff;
+ uiArcingTimer = 13000;
+ } else uiArcingTimer -= diff;
- if (!hasCastedWstomp && HealthBelowPct(25))
+ if (!bHasCastedWstomp && HealthBelowPct(25))
{
DoCast(me, SPELL_WSTOMP);
- hasCastedWstomp = true;
+ bHasCastedWstomp = true;
}
DoMeleeAttackIfReady();
@@ -112,4 +112,4 @@ class boss_ironaya : public CreatureScript
void AddSC_boss_ironaya()
{
new boss_ironaya();
-} \ No newline at end of file
+}
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
index f853e8d8795..f518b0b418d 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/instance_uldaman.cpp
@@ -16,6 +16,14 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/* ScriptData
+SDName: instance_uldaman
+SD%Complete: 99
+SDComment: Need some cosmetics updates when archeadas door are closing (Guardians Waypoints).
+SDCategory: Uldaman
+EndScriptData */
+
+
#include "ScriptPCH.h"
#include "uldaman.h"
@@ -42,42 +50,99 @@ class instance_uldaman : public InstanceMapScript
void Initialize()
{
- archaedasGUID = 0;
- altarOfTheKeeperTempleDoor = 0;
- archaedasTempleDoor = 0;
- ancientVaultDoor = 0;
- whoWokeArchaedasGUID = 0;
+ memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+
+ uiArchaedasGUID = 0;
+ uiIronayaGUID = 0;
+ uiWhoWokeuiArchaedasGUID = 0;
+
+ uiAltarOfTheKeeperTempleDoor = 0;
+ uiArchaedasTempleDoor = 0;
+ uiAncientVaultDoor = 0;
+
+ uiIronayaSealDoor = 0;
+
+ uiKeystoneGUID = 0;
+
+ uiIronayaSealDoorTimer = 27000; //animation time
+ bKeystoneCheck = false;
+ }
+
+ bool IsEncounterInProgress() const
+ {
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (m_auiEncounter[i] == IN_PROGRESS)
+ return true;
+
+ return false;
}
- uint64 archaedasGUID;
- uint64 altarOfTheKeeperTempleDoor;
- uint64 archaedasTempleDoor;
- uint64 ancientVaultDoor;
- uint64 whoWokeArchaedasGUID;
+ uint64 uiArchaedasGUID;
+ uint64 uiIronayaGUID;
+ uint64 uiWhoWokeuiArchaedasGUID;
- std::vector<uint64> stoneKeeper;
- std::vector<uint64> altarOfTheKeeperCount;
- std::vector<uint64> vaultWalker;
- std::vector<uint64> earthenGuardian;
- std::vector<uint64> archaedasWallMinions; // minions lined up around the wall
+ uint64 uiAltarOfTheKeeperTempleDoor;
+ uint64 uiArchaedasTempleDoor;
+ uint64 uiAncientVaultDoor;
+ uint64 uiIronayaSealDoor;
- void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
+ uint64 uiKeystoneGUID;
+
+ uint32 uiIronayaSealDoorTimer;
+ bool bKeystoneCheck;
+
+ std::vector<uint64> vStoneKeeper;
+ std::vector<uint64> vAltarOfTheKeeperCount;
+ std::vector<uint64> vVaultWalker;
+ std::vector<uint64> vEarthenGuardian;
+ std::vector<uint64> vArchaedasWallMinions; // minions lined up around the wall
+
+ uint32 m_auiEncounter[MAX_ENCOUNTER];
+ std::string str_data;
+
+ void OnGameObjectCreate(GameObject* pGO, bool /*add*/)
{
- switch (pGo->GetEntry())
+ switch (pGO->GetEntry())
{
case GO_ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
- altarOfTheKeeperTempleDoor = pGo->GetGUID();
- break;
+ uiAltarOfTheKeeperTempleDoor = pGO->GetGUID();
+
+ if(m_auiEncounter[0] == DONE)
+ HandleGameObject(NULL, true, pGO);
+ break;
case GO_ARCHAEDAS_TEMPLE_DOOR:
- archaedasTempleDoor = pGo->GetGUID();
- break;
+ uiArchaedasTempleDoor = pGO->GetGUID();
+
+ if(m_auiEncounter[0] == DONE)
+ HandleGameObject(NULL, true, pGO);
+ break;
case GO_ANCIENT_VAULT_DOOR:
- pGo->SetGoState(GO_STATE_READY);
- pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- ancientVaultDoor = pGo->GetGUID();
- break;
+ pGO->SetGoState(GO_STATE_READY);
+ pGO->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
+ uiAncientVaultDoor = pGO->GetGUID();
+
+ if(m_auiEncounter[1] == DONE)
+ HandleGameObject(NULL, true, pGO);
+ break;
+
+ case GO_IRONAYA_SEAL_DOOR:
+ uiIronayaSealDoor = pGO->GetGUID();
+
+ if (m_auiEncounter[2] == DONE)
+ HandleGameObject(NULL, true, pGO);
+ break;
+
+ case GO_KEYSTONE:
+ uiKeystoneGUID = pGO->GetGUID();
+
+ if (m_auiEncounter[2] == DONE)
+ {
+ HandleGameObject(NULL, true, pGO);
+ pGO->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ }
+ break;
}
}
@@ -90,19 +155,27 @@ class instance_uldaman : public InstanceMapScript
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
- void OpenDoor(uint64 guid)
+ void SetDoor(uint64 guid, bool open)
{
- GameObject* pGo = instance->GetGameObject(guid);
- if (!pGo)
+ GameObject* pGO = instance->GetGameObject(guid);
+ if (!pGO)
return;
- pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- pGo->SetGoState(GO_STATE_ACTIVE);
+ HandleGameObject(guid, open);
+ }
+
+ void BlockGO(uint64 guid)
+ {
+ GameObject *pGO = instance->GetGameObject(guid);
+ if(!pGO)
+ return;
+
+ pGO->SetUInt32Value(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
}
void ActivateStoneKeepers()
{
- for (std::vector<uint64>::const_iterator i = stoneKeeper.begin(); i != stoneKeeper.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vStoneKeeper.begin(); i != vStoneKeeper.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
@@ -113,16 +186,17 @@ class instance_uldaman : public InstanceMapScript
return; // only want the first one we find
}
// if we get this far than all four are dead so open the door
- SetData (NULL, 0);
+ SetData (DATA_ALTAR_DOORS, DONE);
+ SetDoor (uiArchaedasTempleDoor, true); //open next the door too
}
void ActivateWallMinions()
{
- Creature *archaedas = instance->GetCreature(archaedasGUID);
+ Creature *archaedas = instance->GetCreature(uiArchaedasGUID);
if (!archaedas)
return;
- for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
@@ -137,7 +211,7 @@ class instance_uldaman : public InstanceMapScript
void DeActivateMinions()
{
// first despawn any aggroed wall minions
- for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
@@ -147,7 +221,7 @@ class instance_uldaman : public InstanceMapScript
}
// Vault Walkers
- for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vVaultWalker.begin(); i != vVaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
@@ -157,7 +231,7 @@ class instance_uldaman : public InstanceMapScript
}
// Earthen Guardians
- for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vEarthenGuardian.begin(); i != vEarthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
@@ -169,21 +243,32 @@ class instance_uldaman : public InstanceMapScript
void ActivateArchaedas(uint64 target)
{
- Creature *archaedas = instance->GetCreature(archaedasGUID);
+ Creature *archaedas = instance->GetCreature(uiArchaedasGUID);
if (!archaedas)
return;
if (Unit::GetUnit(*archaedas, target))
{
archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN,false);
- whoWokeArchaedasGUID = target;
+ uiWhoWokeuiArchaedasGUID = target;
}
}
+ void ActivateIronaya()
+ {
+ Creature *ironaya = instance->GetCreature(uiIronayaGUID);
+ if(!ironaya)
+ return;
+
+ ironaya->setFaction(415);
+ ironaya->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
+ ironaya->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+ }
+
void RespawnMinions()
{
// first respawn any aggroed wall minions
- for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vArchaedasWallMinions.begin(); i != vArchaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
@@ -195,7 +280,7 @@ class instance_uldaman : public InstanceMapScript
}
// Vault Walkers
- for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vVaultWalker.begin(); i != vVaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
@@ -207,7 +292,7 @@ class instance_uldaman : public InstanceMapScript
}
// Earthen Guardians
- for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
+ for (std::vector<uint64>::const_iterator i = vEarthenGuardian.begin(); i != vEarthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
@@ -218,17 +303,89 @@ class instance_uldaman : public InstanceMapScript
}
}
}
+ void Update(uint32 diff)
+ {
+ if (!bKeystoneCheck)
+ return;
+
+ if(uiIronayaSealDoorTimer <= diff)
+ {
+ ActivateIronaya();
- void SetData (uint32 /*type*/, uint32 data)
+ SetDoor(uiIronayaSealDoor, true);
+ BlockGO(uiKeystoneGUID);
+
+ SetData(DATA_IRONAYA_DOOR, DONE); //save state
+ bKeystoneCheck = false;
+ }
+ else
+ uiIronayaSealDoorTimer -= diff;
+ }
+
+ void SetData (uint32 type, uint32 data)
{
- //sLog.outError ("SetData: data = %d", data);
- if (data == 0) OpenDoor (altarOfTheKeeperTempleDoor);
- if (data == 0) OpenDoor (archaedasTempleDoor);
- if (data == 3) OpenDoor (ancientVaultDoor);
- if (data == 1) ActivateStoneKeepers();
- if (data == 2) ActivateWallMinions();
- if (data == 4) DeActivateMinions();
- if (data == 5) RespawnMinions();
+ switch(type)
+ {
+ case DATA_ALTAR_DOORS:
+ m_auiEncounter[0] = data;
+ if(data == DONE)
+ SetDoor(uiAltarOfTheKeeperTempleDoor, true);
+ break;
+
+ case DATA_ANCIENT_DOOR:
+ m_auiEncounter[1] = data;
+ if(data == DONE) //archeadas defeat
+ {
+ SetDoor(uiArchaedasTempleDoor, true); //re open enter door
+ SetDoor(uiAncientVaultDoor, true);
+ }
+ break;
+
+ case DATA_IRONAYA_DOOR:
+ m_auiEncounter[2] = data;
+ break;
+
+ case DATA_STONE_KEEPERS:
+ ActivateStoneKeepers();
+ break;
+
+ case DATA_MINIONS:
+ switch(data)
+ {
+ case NOT_STARTED:
+ if (m_auiEncounter[0] == DONE) //if players opened the doors
+ SetDoor(uiArchaedasTempleDoor, true);
+
+ RespawnMinions();
+ break;
+
+ case IN_PROGRESS:
+ ActivateWallMinions();
+ break;
+
+ case SPECIAL:
+ DeActivateMinions();
+ break;
+ }
+ break;
+
+ case DATA_IRONAYA_SEAL:
+ bKeystoneCheck = true;
+ break;
+ }
+
+ if (data == DONE)
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2];
+
+ str_data = saveStream.str();
+
+ SaveToDB();
+ OUT_SAVE_INST_DATA_COMPLETE;
+ }
}
void SetData64 (uint32 type, uint64 data)
@@ -237,35 +394,70 @@ class instance_uldaman : public InstanceMapScript
if (type == 0)
{
ActivateArchaedas (data);
+ SetDoor(uiArchaedasTempleDoor, false); //close when event is started
}
}
+ std::string GetSaveData()
+ {
+ return str_data;
+ }
+
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(in);
+
+ std::istringstream loadStream(in);
+ loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2];
+
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ {
+ if (m_auiEncounter[i] == IN_PROGRESS)
+ m_auiEncounter[i] = NOT_STARTED;
+ }
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch (pCreature->GetEntry()) {
case 4857: // Stone Keeper
SetFrozenState (pCreature);
- stoneKeeper.push_back(pCreature->GetGUID());
+ vStoneKeeper.push_back(pCreature->GetGUID());
break;
case 7309: // Earthen Custodian
- archaedasWallMinions.push_back(pCreature->GetGUID());
+ vArchaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7077: // Earthen Hallshaper
- archaedasWallMinions.push_back(pCreature->GetGUID());
+ vArchaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7076: // Earthen Guardian
- earthenGuardian.push_back(pCreature->GetGUID());
+ vEarthenGuardian.push_back(pCreature->GetGUID());
+ break;
+
+ case 7228: // Ironaya
+ uiIronayaGUID = pCreature->GetGUID();
+
+ if(m_auiEncounter[2] != DONE)
+ SetFrozenState (pCreature);
break;
case 10120: // Vault Walker
- vaultWalker.push_back(pCreature->GetGUID());
+ vVaultWalker.push_back(pCreature->GetGUID());
break;
case 2748: // Archaedas
- archaedasGUID = pCreature->GetGUID();
+ uiArchaedasGUID = pCreature->GetGUID();
break;
} // end switch
@@ -273,18 +465,18 @@ class instance_uldaman : public InstanceMapScript
uint64 GetData64 (uint32 identifier)
{
- if (identifier == 0) return whoWokeArchaedasGUID;
- if (identifier == 1) return vaultWalker[0]; // VaultWalker1
- if (identifier == 2) return vaultWalker[1]; // VaultWalker2
- if (identifier == 3) return vaultWalker[2]; // VaultWalker3
- if (identifier == 4) return vaultWalker[3]; // VaultWalker4
-
- if (identifier == 5) return earthenGuardian[0];
- if (identifier == 6) return earthenGuardian[1];
- if (identifier == 7) return earthenGuardian[2];
- if (identifier == 8) return earthenGuardian[3];
- if (identifier == 9) return earthenGuardian[4];
- if (identifier == 10) return earthenGuardian[5];
+ if (identifier == 0) return uiWhoWokeuiArchaedasGUID;
+ if (identifier == 1) return vVaultWalker[0]; // VaultWalker1
+ if (identifier == 2) return vVaultWalker[1]; // VaultWalker2
+ if (identifier == 3) return vVaultWalker[2]; // VaultWalker3
+ if (identifier == 4) return vVaultWalker[3]; // VaultWalker4
+
+ if (identifier == 5) return vEarthenGuardian[0];
+ if (identifier == 6) return vEarthenGuardian[1];
+ if (identifier == 7) return vEarthenGuardian[2];
+ if (identifier == 8) return vEarthenGuardian[3];
+ if (identifier == 9) return vEarthenGuardian[4];
+ if (identifier == 10) return vEarthenGuardian[5];
return 0;
} // end GetData64
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
index cd1053e0ada..ec4355e7140 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.cpp
@@ -19,16 +19,19 @@
/* ScriptData
SDName: Uldaman
SD%Complete: 100
-SDComment: Quest support: 2278 + 1 trash mob.
+SDComment: Quest support: 2240, 2278 + 1 trash mob.
SDCategory: Uldaman
EndScriptData */
/* ContentData
mob_jadespine_basilisk
npc_lore_keeper_of_norgannon
+go_keystone_chamber
+at_map_chamber
EndContentData */
#include "ScriptPCH.h"
+#include "uldaman.h"
/*######
## mob_jadespine_basilisk
@@ -52,11 +55,11 @@ class mob_jadespine_basilisk : public CreatureScript
{
mob_jadespine_basiliskAI(Creature *c) : ScriptedAI(c) {}
- uint32 Cslumber_Timer;
+ uint32 uiCslumberTimer;
void Reset()
{
- Cslumber_Timer = 2000;
+ uiCslumberTimer = 2000;
}
void EnterCombat(Unit * /*who*/)
@@ -69,14 +72,14 @@ class mob_jadespine_basilisk : public CreatureScript
if (!UpdateVictim())
return;
- //Cslumber_Timer
- if (Cslumber_Timer <= diff)
+ //uiCslumberTimer
+ if (uiCslumberTimer <= diff)
{
//Cast
DoCastVictim(SPELL_CRYSTALLINE_SLUMBER, true);
//Stop attacking target thast asleep and pick new target
- Cslumber_Timer = 28000;
+ uiCslumberTimer = 28000;
Unit* Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
@@ -86,7 +89,7 @@ class mob_jadespine_basilisk : public CreatureScript
if (Target)
me->TauntApply(Target);
- } else Cslumber_Timer -= diff;
+ } else uiCslumberTimer -= diff;
DoMeleeAttackIfReady();
}
@@ -98,6 +101,51 @@ class mob_jadespine_basilisk : public CreatureScript
}
};
+
+
+/*######
+## go_keystone_chamber
+######*/
+
+class go_keystone_chamber : public GameObjectScript
+{
+public:
+ go_keystone_chamber() : GameObjectScript("go_keystone_chamber") { }
+
+ bool OnGossipHello(Player *pPlayer, GameObject * pGo)
+ {
+ if (InstanceScript* pInstance = pGo->GetInstanceScript())
+ if (pInstance)
+ pInstance->SetData(DATA_IRONAYA_SEAL, IN_PROGRESS); //door animation and save state.
+
+ return false;
+ }
+};
+
+/*######
+## at_map_chamber
+######*/
+
+#define QUEST_HIDDEN_CHAMBER 2240
+
+class AreaTrigger_at_map_chamber : public AreaTriggerScript
+{
+ public:
+
+ AreaTrigger_at_map_chamber()
+ : AreaTriggerScript("at_map_chamber")
+ {
+ }
+
+ bool OnTrigger(Player* pPlayer, AreaTriggerEntry const* /*trigger*/)
+ {
+ if (pPlayer && ((Player*)pPlayer)->GetQuestStatus(QUEST_HIDDEN_CHAMBER) == QUEST_STATUS_INCOMPLETE)
+ pPlayer->AreaExploredOrEventHappens(QUEST_HIDDEN_CHAMBER);
+
+ return true;
+ }
+};
+
/*######
## npc_lore_keeper_of_norgannon
######*/
@@ -215,6 +263,8 @@ class npc_lore_keeper_of_norgannon : public CreatureScript
void AddSC_uldaman()
{
new mob_jadespine_basilisk();
+ new go_keystone_chamber();
+ new AreaTrigger_at_map_chamber();
new npc_lore_keeper_of_norgannon();
}
diff --git a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
index 17c27428575..91aae2e21e6 100644
--- a/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
+++ b/src/server/scripts/EasternKingdoms/Uldaman/uldaman.h
@@ -24,6 +24,20 @@ enum eObjects
GO_ARCHAEDAS_TEMPLE_DOOR = 141869,
GO_ALTAR_OF_THE_KEEPER_TEMPLE_DOOR = 124367,
GO_ANCIENT_VAULT_DOOR = 124369,
+ GO_IRONAYA_SEAL_DOOR = 124372,
+ GO_KEYSTONE = 124371,
};
+enum eData
+{
+ DATA_ALTAR_DOORS = 1,
+ DATA_ANCIENT_DOOR = 2,
+ DATA_IRONAYA_DOOR = 3,
+ DATA_STONE_KEEPERS = 4,
+ DATA_MINIONS = 5,
+ DATA_IRONAYA_SEAL = 6,
+};
+
+#define MAX_ENCOUNTER 3
+
#endif