aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp229
1 files changed, 122 insertions, 107 deletions
diff --git a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
index 60776ec9c65..6ae07954950 100644
--- a/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
+++ b/src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
@@ -31,58 +31,54 @@
struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
{
- instance_uldaman(Map *Map) : ScriptedInstance(Map) {
+ instance_uldaman(Map *map) : ScriptedInstance(map)
+ {
Initialize();
- stoneKeepersCounter = 0;
- altarOfTheKeeperCounter = 0;
- vaultWalkerCounter = 0;
- earthenGuardianCounter = 0;
- archaedasWallMinionsCounter = 0;
- whoWokeArchaedasGUID = 0;
};
+ void Initialize()
+ {
+ archaedasGUID = 0;
+ altarOfTheKeeperTempleDoor = 0;
+ archaedasTempleDoor = 0;
+ ancientVaultDoor = 0;
+ whoWokeArchaedasGUID = 0;
+ }
- Creature* archaedas;
- uint64 stoneKeeper[4];
- uint32 stoneKeepersCounter;
-
- uint64 altarOfTheKeeperCount[5];
- uint32 altarOfTheKeeperCounter;
-
- uint64 vaultWalker[4];
- uint32 vaultWalkerCounter;
-
- uint64 earthenGuardian[6];
- uint32 earthenGuardianCounter;
-
- uint64 archaedasWallMinions[100]; // minions lined up around the wall
- uint32 archaedasWallMinionsCounter;
-
- GameObject *altarOfTheKeeperTempleDoor;
- GameObject *archaedasTempleDoor;
- GameObject *ancientVaultDoor;
-
+ uint64 archaedasGUID;
+ uint64 altarOfTheKeeperTempleDoor;
+ uint64 archaedasTempleDoor;
+ uint64 ancientVaultDoor;
uint64 whoWokeArchaedasGUID;
- void OnObjectCreate (GameObject* go) {
- switch (go->GetEntry()) {
+ 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
+
+ void OnObjectCreate (GameObject* go)
+ {
+ switch (go->GetEntry())
+ {
case ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
- altarOfTheKeeperTempleDoor = go;
+ altarOfTheKeeperTempleDoor = go->GetGUID();
break;
case ARCHAEDAS_TEMPLE_DOOR:
- archaedasTempleDoor = go;
+ archaedasTempleDoor = go->GetGUID();
break;
case ANCIENT_VAULT_DOOR:
go->SetUInt32Value(GAMEOBJECT_STATE,1);
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
- ancientVaultDoor = go;
+ ancientVaultDoor = go->GetGUID();
break;
}
}
- void SetFrozenState(Creature *creature) {
+ void SetFrozenState(Creature *creature)
+ {
creature->setFaction(35);
creature->RemoveAllAuras();
//creature->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_ANIMATION_FROZEN);
@@ -90,121 +86,137 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
- void OpenDoor (GameObject *go) {
- if (!go) return;
+ void OpenDoor(uint64 guid)
+ {
+ GameObject *go = instance->GetGameObjectInMap(guid);
+ if(!go)
+ return;
+
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
go->SetUInt32Value(GAMEOBJECT_STATE, 0);
}
-
-
- void ActivateStoneKeepers() {
- Creature *target;
- uint32 counter = stoneKeepersCounter;
- // error_log ("ActivateStoneKeepers");
- // error_log ("counter = %d", counter);
- for (; counter>0; ) {
- target = (Creature *) Unit::GetUnit(*archaedas,stoneKeeper[--counter]);
- if (!target || !target->isAlive() || target->getFaction()==14) continue;
- target->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
+ void ActivateStoneKeepers()
+ {
+ for(std::vector<uint64>::iterator i = stoneKeeper.begin(); i != stoneKeeper.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (!target || !target->isAlive() || target->getFaction()==14)
+ continue;
+ target->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
target->setFaction(14);
target->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
return; // only want the first one we find
}
- // error_log ("opening doors");
// if we get this far than all four are dead so open the door
SetData (NULL, 0);
}
- void ActivateWallMinions() {
- Creature *target;
- uint32 counter = archaedasWallMinionsCounter;
- for (; counter>0; ) {
- target = (Creature *) Unit::GetUnit(*archaedas,archaedasWallMinions[--counter]);
- if (!target || !target->isAlive() || target->getFaction()==14) continue;
- archaedas->CastSpell (target, SPELL_AWAKEN_VAULT_WALKER, true);
+ void ActivateWallMinions()
+ {
+ Creature *archaedas = instance->GetCreatureInMap(archaedasGUID);
+ if(!archaedas)
+ return;
+
+ for(std::vector<uint64>::iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (!target || !target->isAlive() || target->getFaction()==14)
+ continue;
+ archaedas->CastSpell(target, SPELL_AWAKEN_VAULT_WALKER, true);
target->CastSpell(target, SPELL_ARCHAEDAS_AWAKEN,true);
return; // only want the first one we find
}
}
// used when Archaedas dies. All active minions must be despawned.
- void DeActivateMinions() {
- Creature *target;
- uint32 counter = archaedasWallMinionsCounter;
-
+ void DeActivateMinions()
+ {
// first despawn any aggroed wall minions
- for (; counter>0; ) {
- target = (Creature *) Unit::GetUnit(*archaedas,archaedasWallMinions[--counter]);
- if (!target || target->isDead() || target->getFaction()!=14) continue;
- target->RemoveFromWorld();
- target->AI()->EnterEvadeMode(); // need this b/c it still attacks even when removed
+ for(std::vector<uint64>::iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (!target || target->isDead() || target->getFaction()!=14)
+ continue;
+ target->setDeathState(JUST_DIED);
+ target->RemoveCorpse();
}
// Vault Walkers
- for (counter=0; counter<4; counter++) {
- target = (Creature *) Unit::GetUnit(*archaedas,vaultWalker[counter]);
- if (!target || target->isDead() || target->getFaction() != 14) continue;
- target->RemoveFromWorld();
- target->AI()->EnterEvadeMode(); // need this b/c it sill attacks even when removed
+ for(std::vector<uint64>::iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (!target || target->isDead() || target->getFaction()!=14)
+ continue;
+ target->setDeathState(JUST_DIED);
+ target->RemoveCorpse();
}
// Earthen Guardians
- for (counter=0; counter<6; counter++) {
- target = (Creature *) Unit::GetUnit(*archaedas,earthenGuardian[counter]);
- if (!target || target->isDead() || target->getFaction() != 14) continue;
- target->RemoveFromWorld();
- target->AI()->EnterEvadeMode(); // need this b/c it sill attacks even when removed
+ for(std::vector<uint64>::iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (!target || target->isDead() || target->getFaction()!=14)
+ continue;
+ target->setDeathState(JUST_DIED);
+ target->RemoveCorpse();
}
}
- void ActivateArchaedas(uint64 target) {
-
- Unit *victim = Unit::GetUnit(*archaedas, target);
- archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN,false);
- whoWokeArchaedasGUID = target;
+ void ActivateArchaedas(uint64 target)
+ {
+ Creature *archaedas = instance->GetCreatureInMap(archaedasGUID);
+ if(!archaedas)
+ return;
+
+ if(Unit *victim = Unit::GetUnit(*archaedas, target))
+ {
+ archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN,false);
+ whoWokeArchaedasGUID = target;
+ }
}
- void RespawnMinions() {
- Creature *target;
- uint32 counter = archaedasWallMinionsCounter;
-
- // first respawn any wall minions
- for (; counter>0; ) {
- target = (Creature *) Unit::GetUnit(*archaedas,archaedasWallMinions[--counter]);
- if (target && target->isDead()) {
+ void RespawnMinions()
+ {
+ // first respawn any aggroed wall minions
+ for(std::vector<uint64>::iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (target && target->isDead())
+ {
target->Respawn();
target->GetMotionMaster()->MoveTargetedHome();
- //target->AI()->EnterEvadeMode();
SetFrozenState(target);
}
}
// Vault Walkers
- for (counter=0; counter<4; counter++) {
- target = (Creature *) Unit::GetUnit(*archaedas,vaultWalker[counter]);
- if (target && target->isDead()) {
+ for(std::vector<uint64>::iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (target && target->isDead())
+ {
target->Respawn();
target->GetMotionMaster()->MoveTargetedHome();
- // target->AI()->EnterEvadeMode();
SetFrozenState(target);
}
}
// Earthen Guardians
- for (counter=0; counter<6; counter++) {
- target = (Creature *) Unit::GetUnit(*archaedas,earthenGuardian[counter]);
- if (target && target->isDead()) {
+ for(std::vector<uint64>::iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
+ {
+ Creature *target = instance->GetCreatureInMap(*i);
+ if (target && target->isDead())
+ {
target->Respawn();
target->GetMotionMaster()->MoveTargetedHome();
- //target->AI()->EnterEvadeMode();
SetFrozenState(target);
}
}
-
}
- void SetData (uint32 type, uint32 data) {
+ void SetData (uint32 type, uint32 data)
+ {
//error_log ("SetData: data = %d", data);
if (data==0) OpenDoor (altarOfTheKeeperTempleDoor);
if (data==0) OpenDoor (archaedasTempleDoor);
@@ -216,8 +228,11 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
}
- void SetData64 (uint32 type, uint64 data) {
- if (type==0 ) { // Archaedas
+ void SetData64 (uint32 type, uint64 data)
+ {
+ // Archaedas
+ if (type==0 )
+ {
ActivateArchaedas (data);
}
}
@@ -228,33 +243,34 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
switch (creature_entry) {
case 4857: // Stone Keeper
SetFrozenState (creature);
- stoneKeeper[stoneKeepersCounter++] = creature->GetGUID();
+ stoneKeeper.push_back(creature->GetGUID());
break;
case 7309: // Earthen Custodian
- archaedasWallMinions[archaedasWallMinionsCounter++] = creature->GetGUID();
+ archaedasWallMinions.push_back(creature->GetGUID());
break;
case 7077: // Earthen Hallshaper
- archaedasWallMinions[archaedasWallMinionsCounter++] = creature->GetGUID();
+ archaedasWallMinions.push_back(creature->GetGUID());
break;
case 7076: // Earthen Guardian
- earthenGuardian[earthenGuardianCounter++] = creature->GetGUID();
+ earthenGuardian.push_back(creature->GetGUID());
break;
case 10120: // Vault Walker
- vaultWalker[vaultWalkerCounter++] = creature->GetGUID();
+ vaultWalker.push_back(creature->GetGUID());
break;
case 2748: // Archaedas
- archaedas = creature;
+ archaedasGUID = creature->GetGUID();
break;
} // end switch
} // end OnCreatureCreate
- uint64 GetData64 (uint32 identifier) {
+ uint64 GetData64 (uint32 identifier)
+ {
if (identifier == 0) return whoWokeArchaedasGUID;
if (identifier == 1) return vaultWalker[0]; // VaultWalker1
if (identifier == 2) return vaultWalker[1]; // VaultWalker2
@@ -270,7 +286,6 @@ struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
return 0;
} // end GetData64
-
};