mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 10:05:32 +01:00
*Uldaman script. By peldor.
--HG-- branch : trunk
This commit is contained in:
14
sql/updates/425_world_scripts.sql
Normal file
14
sql/updates/425_world_scripts.sql
Normal file
@@ -0,0 +1,14 @@
|
||||
UPDATE gameobject_template set scriptName="go_altar_of_the_keepers" where entry = 130511;
|
||||
UPDATE gameobject_template set scriptName="go_altar_of_archaedas" where entry = 133234;
|
||||
|
||||
UPDATE instance_template SET script="instance_uldaman" where map = 70;
|
||||
|
||||
-- Archaedas
|
||||
UPDATE creature_template SET ScriptName="boss_archaedas" where entry = 2748;
|
||||
|
||||
-- Archaedas' minions
|
||||
UPDATE creature_template SET ScriptName="mob_archaedas_minions" where entry in ('7309', '7077', '7076', '10120');
|
||||
|
||||
-- Stone keepers
|
||||
UPDATE creature_template SET ScriptName="mob_stonekeepers" where entry = 4857;
|
||||
|
||||
@@ -368,6 +368,8 @@ scripts/zone/temple_of_ahnqiraj/mob_anubisath_sentinel.cpp \
|
||||
scripts/zone/terokkar_forest/terokkar_forest.cpp \
|
||||
scripts/zone/thunder_bluff/thunder_bluff.cpp \
|
||||
scripts/zone/tirisfal_glades/tirisfal_glades.cpp \
|
||||
scripts/zone/uldaman/boss_archaedas.cpp \
|
||||
scripts/zone/uldaman/instance_uldaman.cpp \
|
||||
scripts/zone/uldaman/boss_ironaya.cpp \
|
||||
scripts/zone/uldaman/uldaman.cpp \
|
||||
scripts/zone/undercity/undercity.cpp \
|
||||
|
||||
@@ -541,8 +541,10 @@ extern void AddSC_thunder_bluff();
|
||||
extern void AddSC_tirisfal_glades();
|
||||
|
||||
//Uldaman
|
||||
extern void AddSC_boss_archaedas();
|
||||
extern void AddSC_boss_ironaya();
|
||||
extern void AddSC_uldaman();
|
||||
extern void AddSC_instance_uldaman();
|
||||
|
||||
//Undercity
|
||||
extern void AddSC_undercity();
|
||||
@@ -1731,8 +1733,10 @@ void ScriptsInit()
|
||||
AddSC_tirisfal_glades();
|
||||
|
||||
//Uldaman
|
||||
AddSC_boss_archaedas();
|
||||
AddSC_boss_ironaya();
|
||||
AddSC_uldaman();
|
||||
AddSC_instance_uldaman();
|
||||
|
||||
//Undercity
|
||||
AddSC_undercity();
|
||||
|
||||
@@ -1141,6 +1141,14 @@
|
||||
<Filter
|
||||
Name="Uldaman"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
|
||||
>
|
||||
|
||||
@@ -1386,6 +1386,14 @@
|
||||
<Filter
|
||||
Name="Uldaman"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
|
||||
>
|
||||
|
||||
@@ -1372,6 +1372,14 @@
|
||||
<Filter
|
||||
Name="Uldaman"
|
||||
>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_archaedas.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\instance_uldaman.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\scripts\zone\uldaman\boss_ironaya.cpp"
|
||||
>
|
||||
|
||||
491
src/bindings/scripts/scripts/zone/uldaman/boss_archaedas.cpp
Normal file
491
src/bindings/scripts/scripts/zone/uldaman/boss_archaedas.cpp
Normal file
@@ -0,0 +1,491 @@
|
||||
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* ScriptData
|
||||
SDName: boss_archaedas
|
||||
SD%Complete: 100
|
||||
SDComment: Archaedas is activated when 3 prople click on his altar.
|
||||
Every 10 seconds he will awaken one of his minions along the wall.
|
||||
At 66%, he will awaken the 6 Guardians.
|
||||
At 33%, he will awaken the Vault Walkers
|
||||
On his death the vault door opens.
|
||||
EndScriptData */
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
|
||||
#define SAY_AGGRO "Who dares awaken Archaedas? Who dares the wrath of the makers!"
|
||||
#define SOUND_AGGRO 5855
|
||||
|
||||
#define SAY_SUMMON "Awake ye servants, defend the discs!"
|
||||
#define SOUND_SUMMON 5856
|
||||
|
||||
#define SAY_SUMMON2 "To my side, brothers. For the makers!"
|
||||
#define SOUND_SUMMON2 5857
|
||||
|
||||
#define SAY_KILL "Reckless mortal."
|
||||
#define SOUND_KILL 5858
|
||||
|
||||
#define SPELL_GROUND_TREMOR 6524
|
||||
#define SPELL_ARCHAEDAS_AWAKEN 10347
|
||||
#define SPELL_BOSS_OBJECT_VISUAL 11206
|
||||
#define SPELL_BOSS_AGGRO 10340
|
||||
#define SPELL_SUB_BOSS_AGGRO 11568
|
||||
#define SPELL_AWAKEN_VAULT_WALKER 10258
|
||||
#define SPELL_AWAKEN_EARTHEN_GUARDIAN 10252
|
||||
|
||||
struct TRINITY_DLL_DECL boss_archaedasAI : public ScriptedAI
|
||||
{
|
||||
boss_archaedasAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)m_creature->GetInstanceData());
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 Tremor_Timer;
|
||||
int32 Awaken_Timer;
|
||||
uint32 WallMinionTimer;
|
||||
bool wakingUp;
|
||||
|
||||
bool InCombat;
|
||||
bool guardiansAwake;
|
||||
bool vaultWalkersAwake;
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Tremor_Timer = 60000;
|
||||
Awaken_Timer = 0;
|
||||
WallMinionTimer = 10000;
|
||||
|
||||
InCombat = false;
|
||||
wakingUp = false;
|
||||
guardiansAwake = false;
|
||||
vaultWalkersAwake = false;
|
||||
|
||||
if (pInstance) pInstance->SetData (NULL, 5); // respawn any dead minions
|
||||
m_creature->setFaction(35);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
|
||||
}
|
||||
|
||||
void ActivateMinion (uint64 guid, bool flag)
|
||||
{
|
||||
Unit *minion = Unit::GetUnit(*m_creature, guid);
|
||||
|
||||
if (minion && minion->isAlive())
|
||||
{
|
||||
DoCast (minion, SPELL_AWAKEN_VAULT_WALKER, flag);
|
||||
minion->CastSpell(minion, SPELL_ARCHAEDAS_AWAKEN,true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
m_creature->setFaction (14);
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
|
||||
void SpellHit (Unit* caster, const SpellEntry *spell)
|
||||
{
|
||||
// Being woken up from the altar, start the awaken sequence
|
||||
if (spell == GetSpellStore()->LookupEntry(SPELL_ARCHAEDAS_AWAKEN)) {
|
||||
DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
|
||||
DoPlaySoundToSet(m_creature,SOUND_AGGRO);
|
||||
Awaken_Timer = 4000;
|
||||
wakingUp = true;
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit *victim)
|
||||
{
|
||||
DoYell(SAY_KILL,LANG_UNIVERSAL, NULL);
|
||||
DoPlaySoundToSet(m_creature, SOUND_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
// we're still doing awaken animation
|
||||
if (wakingUp && Awaken_Timer >= 0) {
|
||||
Awaken_Timer -= diff;
|
||||
return; // dont do anything until we are done
|
||||
} else if (wakingUp && Awaken_Timer <= 0) {
|
||||
wakingUp = false;
|
||||
AttackStart(Unit::GetUnit(*m_creature, pInstance->GetData64(0)));
|
||||
return; // dont want to continue until we finish the AttackStart method
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
|
||||
// wake a wall minion
|
||||
if (WallMinionTimer < diff) {
|
||||
pInstance->SetData (NULL, 2);
|
||||
|
||||
WallMinionTimer = 10000;
|
||||
} else WallMinionTimer -= diff;
|
||||
|
||||
//If we are <66 summon the guardians
|
||||
if ( !guardiansAwake && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 66) {
|
||||
ActivateMinion(pInstance->GetData64(5),true); // EarthenGuardian1
|
||||
ActivateMinion(pInstance->GetData64(6),true); // EarthenGuardian2
|
||||
ActivateMinion(pInstance->GetData64(7),true); // EarthenGuardian3
|
||||
ActivateMinion(pInstance->GetData64(8),true); // EarthenGuardian4
|
||||
ActivateMinion(pInstance->GetData64(9),true); // EarthenGuardian5
|
||||
ActivateMinion(pInstance->GetData64(10),false); // EarthenGuardian6
|
||||
DoYell(SAY_SUMMON,LANG_UNIVERSAL, NULL);
|
||||
DoPlaySoundToSet(m_creature, SOUND_SUMMON);
|
||||
guardiansAwake = true;
|
||||
}
|
||||
|
||||
//If we are <33 summon the vault walkers
|
||||
if ( !vaultWalkersAwake && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 33) {
|
||||
ActivateMinion(pInstance->GetData64(1),true); // VaultWalker1
|
||||
ActivateMinion(pInstance->GetData64(2),true); // VaultWalker2
|
||||
ActivateMinion(pInstance->GetData64(3),true); // VaultWalker3
|
||||
ActivateMinion(pInstance->GetData64(4),false); // VaultWalker4
|
||||
DoYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
|
||||
DoPlaySoundToSet(m_creature, SOUND_SUMMON2);
|
||||
vaultWalkersAwake = true;
|
||||
}
|
||||
|
||||
|
||||
if (Tremor_Timer < diff)
|
||||
{
|
||||
//Cast
|
||||
DoCast(m_creature->getVictim(),SPELL_GROUND_TREMOR);
|
||||
|
||||
//45 seconds until we should cast this agian
|
||||
Tremor_Timer = 45000;
|
||||
}else Tremor_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied (Unit *killer) {
|
||||
pInstance->SetData(NULL,3); // open the vault door
|
||||
pInstance->SetData(NULL,4); // deactivate his minions
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_boss_archaedas(Creature *_Creature)
|
||||
{
|
||||
return new boss_archaedasAI (_Creature);
|
||||
}
|
||||
|
||||
/* ScriptData
|
||||
SDName: mob_archaedas_minions
|
||||
SD%Complete: 100
|
||||
SDComment: These mobs are initially frozen until Archaedas awakens them
|
||||
one at a time.
|
||||
EndScriptData */
|
||||
|
||||
|
||||
#define SPELL_ARCHAEDAS_AWAKEN 10347
|
||||
|
||||
struct TRINITY_DLL_DECL mob_archaedas_minionsAI : public ScriptedAI
|
||||
{
|
||||
mob_archaedas_minionsAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)m_creature->GetInstanceData());
|
||||
Reset();
|
||||
}
|
||||
|
||||
uint32 Arcing_Timer;
|
||||
int32 Awaken_Timer;
|
||||
bool wakingUp;
|
||||
|
||||
bool InCombat;
|
||||
bool amIAwake;
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Arcing_Timer = 3000;
|
||||
Awaken_Timer = 0;
|
||||
|
||||
InCombat = false;
|
||||
wakingUp = false;
|
||||
amIAwake = false;
|
||||
|
||||
m_creature->setFaction(35);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
m_creature->RemoveAllAuras();
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
m_creature->setFaction (14);
|
||||
m_creature->RemoveAllAuras();
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
amIAwake = 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;
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if(amIAwake)
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
// we're still in the awaken animation
|
||||
if (wakingUp && Awaken_Timer >= 0) {
|
||||
Awaken_Timer -= diff;
|
||||
return; // dont do anything until we are done
|
||||
} else if (wakingUp && Awaken_Timer <= 0) {
|
||||
wakingUp = false;
|
||||
amIAwake = true;
|
||||
AttackStart(Unit::GetUnit(*m_creature, pInstance->GetData64(0))); // whoWokeArchaedasGUID
|
||||
return; // dont want to continue until we finish the AttackStart method
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_archaedas_minions(Creature *_Creature)
|
||||
{
|
||||
return new mob_archaedas_minionsAI (_Creature);
|
||||
}
|
||||
|
||||
/* ScriptData
|
||||
SDName: go_altar_archaedas
|
||||
SD%Complete: 100
|
||||
SDComment: Needs 3 people to activate the Archaedas script
|
||||
SDCategory: Uldaman
|
||||
EndScriptData */
|
||||
|
||||
|
||||
#define OBJECT_ALTAR_OF_ARCHAEDAS 133234
|
||||
|
||||
#define NUMBER_NEEDED_TO_ACTIVATE 3
|
||||
|
||||
#define SPELL_BOSS_OBJECT_VISUAL 11206
|
||||
|
||||
uint64 altarOfArchaedasCount[5];
|
||||
int32 altarOfArchaedasCounter=0;
|
||||
|
||||
|
||||
bool GOHello_go_altar_of_archaedas(Player *player, GameObject* go)
|
||||
{
|
||||
bool alreadyUsed;
|
||||
go->AddUse ();
|
||||
|
||||
alreadyUsed = false;
|
||||
for (uint32 loop=0; loop<5; loop++) {
|
||||
if (altarOfArchaedasCount[loop] == player->GetGUID()) alreadyUsed = true;
|
||||
}
|
||||
if (!alreadyUsed)
|
||||
altarOfArchaedasCount[altarOfArchaedasCounter++] = player->GetGUID();
|
||||
|
||||
player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false);
|
||||
|
||||
if (altarOfArchaedasCounter < NUMBER_NEEDED_TO_ACTIVATE) {
|
||||
return false; // not enough people yet
|
||||
}
|
||||
|
||||
// Check to make sure at least three people are still casting
|
||||
uint32 count=0;
|
||||
Unit *pTarget;
|
||||
for (uint32 x=0; x<=5; x++) {
|
||||
pTarget = Unit::GetUnit(*player, altarOfArchaedasCount[x]);
|
||||
if (!pTarget) continue;
|
||||
if (pTarget->IsNonMeleeSpellCasted(true)) count++;
|
||||
if (count >= NUMBER_NEEDED_TO_ACTIVATE) break;
|
||||
}
|
||||
|
||||
if (count < NUMBER_NEEDED_TO_ACTIVATE) {
|
||||
return false; // not enough people
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance = ((ScriptedInstance*)player->GetInstanceData());
|
||||
if (!pInstance) return false;
|
||||
pInstance->SetData(NULL,0);
|
||||
pInstance->SetData64(0,player->GetGUID()); // activate archaedas
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* ScriptData
|
||||
SDName: mob_stonekeepers
|
||||
SD%Complete: 100
|
||||
SDComment: After activating the altar of the keepers, the stone keepers will
|
||||
wake up one by one.
|
||||
EndScriptData */
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
#define SPELL_SELF_DESTRUCT 9874
|
||||
|
||||
struct TRINITY_DLL_DECL mob_stonekeepersAI : public ScriptedAI
|
||||
{
|
||||
mob_stonekeepersAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = ((ScriptedInstance*)m_creature->GetInstanceData());
|
||||
Reset();
|
||||
}
|
||||
|
||||
bool InCombat;
|
||||
ScriptedInstance* pInstance;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
InCombat = false;
|
||||
m_creature->setFaction(35);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
m_creature->RemoveAllAuras();
|
||||
}
|
||||
|
||||
void Aggro(Unit *who)
|
||||
{
|
||||
m_creature->setFaction (14);
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
m_creature->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
|
||||
//Return since we have no target
|
||||
if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void DamageTaken (Unit *attacker, uint32 &damage) {
|
||||
if (damage > m_creature->GetHealth()) {
|
||||
DoCast (m_creature, SPELL_SELF_DESTRUCT,true);
|
||||
pInstance->SetData(NULL, 1); // activate next stonekeeper
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI_mob_stonekeepers(Creature *_Creature)
|
||||
{
|
||||
return new mob_stonekeepersAI (_Creature);
|
||||
}
|
||||
|
||||
/* ScriptData
|
||||
SDName: go_altar_of_the_keepers
|
||||
SD%Complete: 100
|
||||
SDComment: Need 3 people to activate to open the altar. One by one the StoneKeepers will activate. After all four are dead than the door will open.
|
||||
SDCategory: Uldaman
|
||||
EndScriptData */
|
||||
|
||||
|
||||
#define SPELL_BOSS_OBJECT_VISUAL 11206
|
||||
|
||||
#define NUMBER_NEEDED_TO_ACTIVATE 3
|
||||
|
||||
static uint64 altarOfTheKeeperCount[5];
|
||||
static uint32 altarOfTheKeeperCounter=0;
|
||||
|
||||
|
||||
bool GOHello_go_altar_of_the_keepers(Player *player, GameObject* go)
|
||||
{
|
||||
bool alreadyUsed;
|
||||
|
||||
go->AddUse ();
|
||||
|
||||
alreadyUsed = false;
|
||||
for (uint32 loop=0; loop<5; loop++) {
|
||||
if (altarOfTheKeeperCount[loop] == player->GetGUID()) alreadyUsed = true;
|
||||
}
|
||||
if (!alreadyUsed)
|
||||
altarOfTheKeeperCount[altarOfTheKeeperCounter++] = player->GetGUID();
|
||||
player->CastSpell (player, SPELL_BOSS_OBJECT_VISUAL, false);
|
||||
|
||||
if (altarOfTheKeeperCounter < NUMBER_NEEDED_TO_ACTIVATE) {
|
||||
//error_log ("not enough people yet, altarOfTheKeeperCounter = %d", altarOfTheKeeperCounter);
|
||||
return false; // not enough people yet
|
||||
}
|
||||
|
||||
// Check to make sure at least three people are still casting
|
||||
uint32 count=0;
|
||||
Unit *pTarget;
|
||||
for (uint32 x=0; x<=5; x++) {
|
||||
pTarget = Unit::GetUnit(*player, altarOfTheKeeperCount[x]);
|
||||
//error_log ("number of people currently activating it: %d", x+1);
|
||||
if (!pTarget) continue;
|
||||
if (pTarget->IsNonMeleeSpellCasted(true)) count++;
|
||||
if (count >= NUMBER_NEEDED_TO_ACTIVATE) break;
|
||||
}
|
||||
|
||||
if (count < NUMBER_NEEDED_TO_ACTIVATE) {
|
||||
// error_log ("still not enough people");
|
||||
return false; // not enough people
|
||||
}
|
||||
|
||||
ScriptedInstance* pInstance = ((ScriptedInstance*)player->GetInstanceData());
|
||||
if (!pInstance) return false;
|
||||
//error_log ("activating stone keepers");
|
||||
pInstance->SetData(NULL,1); // activate the Stone Keepers
|
||||
return true;
|
||||
}
|
||||
|
||||
void AddSC_boss_archaedas()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name="boss_archaedas";
|
||||
newscript->GetAI = GetAI_boss_archaedas;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="go_altar_of_archaedas";
|
||||
newscript->pGOHello = &GOHello_go_altar_of_archaedas;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="mob_archaedas_minions";
|
||||
newscript->GetAI = GetAI_mob_archaedas_minions;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="go_altar_of_the_keepers";
|
||||
newscript->pGOHello = &GOHello_go_altar_of_the_keepers;
|
||||
newscript->RegisterSelf();
|
||||
|
||||
newscript = new Script;
|
||||
newscript->Name="mob_stonekeepers";
|
||||
newscript->GetAI = GetAI_mob_stonekeepers;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
290
src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
Normal file
290
src/bindings/scripts/scripts/zone/uldaman/instance_uldaman.cpp
Normal file
@@ -0,0 +1,290 @@
|
||||
/* Copyright (C) 2006,2007 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
|
||||
#include "precompiled.h"
|
||||
|
||||
|
||||
#define SPELL_ARCHAEDAS_AWAKEN 10347
|
||||
#define SPELL_AWAKEN_VAULT_WALKER 10258
|
||||
|
||||
#define ARCHAEDAS_TEMPLE_DOOR 141869
|
||||
#define ALTAR_OF_ARCHAEDAS 133234
|
||||
|
||||
#define ALTAR_OF_THE_KEEPER_TEMPLE_DOOR 124367
|
||||
#define ALTAR_OF_THE_KEEPER_TEMPLE 130511
|
||||
|
||||
#define ANCIENT_VAULT_DOOR 124369
|
||||
|
||||
struct TRINITY_DLL_DECL instance_uldaman : public ScriptedInstance
|
||||
{
|
||||
instance_uldaman(Map *Map) : ScriptedInstance(Map) {
|
||||
Initialize();
|
||||
stoneKeepersCounter = 0;
|
||||
altarOfTheKeeperCounter = 0;
|
||||
vaultWalkerCounter = 0;
|
||||
earthenGuardianCounter = 0;
|
||||
archaedasWallMinionsCounter = 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 whoWokeArchaedasGUID;
|
||||
|
||||
void OnObjectCreate (GameObject* go) {
|
||||
switch (go->GetEntry()) {
|
||||
case ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
|
||||
altarOfTheKeeperTempleDoor = go;
|
||||
break;
|
||||
|
||||
case ARCHAEDAS_TEMPLE_DOOR:
|
||||
archaedasTempleDoor = go;
|
||||
break;
|
||||
|
||||
case ANCIENT_VAULT_DOOR:
|
||||
go->SetUInt32Value(GAMEOBJECT_STATE,1);
|
||||
go->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
|
||||
ancientVaultDoor = go;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetFrozenState(Creature *creature) {
|
||||
creature->setFaction(35);
|
||||
creature->RemoveAllAuras();
|
||||
//creature->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_ANIMATION_FROZEN);
|
||||
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
}
|
||||
|
||||
void OpenDoor (GameObject *go) {
|
||||
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);
|
||||
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);
|
||||
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;
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
}
|
||||
|
||||
void ActivateArchaedas(uint64 target) {
|
||||
|
||||
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()) {
|
||||
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()) {
|
||||
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()) {
|
||||
target->Respawn();
|
||||
target->GetMotionMaster()->MoveTargetedHome();
|
||||
//target->AI()->EnterEvadeMode();
|
||||
SetFrozenState(target);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SetData (uint32 type, uint32 data) {
|
||||
//error_log ("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();
|
||||
}
|
||||
|
||||
|
||||
void SetData64 (uint32 type, uint64 data) {
|
||||
if (type==0 ) { // Archaedas
|
||||
ActivateArchaedas (data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OnCreatureCreate (Creature *creature, uint32 creature_entry)
|
||||
{
|
||||
switch (creature_entry) {
|
||||
case 4857: // Stone Keeper
|
||||
SetFrozenState (creature);
|
||||
stoneKeeper[stoneKeepersCounter++] = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case 7309: // Earthen Custodian
|
||||
archaedasWallMinions[archaedasWallMinionsCounter++] = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case 7077: // Earthen Hallshaper
|
||||
archaedasWallMinions[archaedasWallMinionsCounter++] = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case 7076: // Earthen Guardian
|
||||
earthenGuardian[earthenGuardianCounter++] = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case 10120: // Vault Walker
|
||||
vaultWalker[vaultWalkerCounter++] = creature->GetGUID();
|
||||
break;
|
||||
|
||||
case 2748: // Archaedas
|
||||
archaedas = creature;
|
||||
break;
|
||||
|
||||
} // end switch
|
||||
} // end OnCreatureCreate
|
||||
|
||||
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];
|
||||
|
||||
return 0;
|
||||
} // end GetData64
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
InstanceData* GetInstanceData_instance_uldaman(Map* map)
|
||||
{
|
||||
return new instance_uldaman(map);
|
||||
}
|
||||
|
||||
void AddSC_instance_uldaman()
|
||||
{
|
||||
Script *newscript;
|
||||
newscript = new Script;
|
||||
newscript->Name = "instance_uldaman";
|
||||
newscript->GetInstanceData = GetInstanceData_instance_uldaman;
|
||||
newscript->RegisterSelf();
|
||||
}
|
||||
Reference in New Issue
Block a user