Converting EasternKingdoms/Uldaman

--HG--
branch : trunk
This commit is contained in:
John Holiver
2010-08-07 20:42:50 -03:00
parent 5aa6bb2169
commit af15ba29d1
4 changed files with 834 additions and 873 deletions

View File

@@ -38,160 +38,171 @@ EndScriptData */
#define SOUND_SUMMON2 5857
#define SAY_KILL "Reckless mortal."
#define SOUND_KILL 5858
#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 boss_archaedasAI : public ScriptedAI
enum eSpells
{
boss_archaedasAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
uint32 Tremor_Timer;
int32 Awaken_Timer;
uint32 WallMinionTimer;
bool wakingUp;
bool guardiansAwake;
bool vaultWalkersAwake;
ScriptedInstance* pInstance;
void Reset()
{
Tremor_Timer = 60000;
Awaken_Timer = 0;
WallMinionTimer = 10000;
wakingUp = false;
guardiansAwake = false;
vaultWalkersAwake = false;
if (pInstance)
pInstance->SetData (NULL, 5); // respawn any dead minions
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
void ActivateMinion (uint64 guid, bool flag)
{
Unit *minion = Unit::GetUnit(*me, guid);
if (minion && minion->isAlive())
{
DoCast (minion, SPELL_AWAKEN_VAULT_WALKER, flag);
minion->CastSpell(minion, SPELL_ARCHAEDAS_AWAKEN,true);
}
}
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->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)) {
me->MonsterYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(me,SOUND_AGGRO);
Awaken_Timer = 4000;
wakingUp = true;
}
}
void KilledUnit(Unit * /*victim*/)
{
me->MonsterYell(SAY_KILL,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_KILL);
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
// 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(*me, pInstance->GetData64(0)));
return; // dont want to continue until we finish the AttackStart method
}
//Return since we have no target
if (!UpdateVictim())
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 && me->GetHealth()*100 / me->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
me->MonsterYell(SAY_SUMMON,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_SUMMON);
guardiansAwake = true;
}
//If we are <33 summon the vault walkers
if (!vaultWalkersAwake && me->GetHealth()*100 / me->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
me->MonsterYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_SUMMON2);
vaultWalkersAwake = true;
}
if (Tremor_Timer <= diff)
{
//Cast
DoCast(me->getVictim(), SPELL_GROUND_TREMOR);
//45 seconds until we should cast this agian
Tremor_Timer = 45000;
} else Tremor_Timer -= diff;
DoMeleeAttackIfReady();
}
void JustDied (Unit * /*killer*/) {
if (pInstance)
{
pInstance->SetData(NULL,3); // open the vault door
pInstance->SetData(NULL,4); // deactivate his minions
}
}
SPELL_GROUND_TREMOR = 6524,
SPELL_ARCHAEDAS_AWAKEN = 10347,
SPELL_BOSS_OBJECT_VISUAL = 11206,
SPELL_BOSS_AGGRO = 10340,
SPELL_SUB_BOSS_AGGRO = 11568,
SPELL_AWAKEN_VAULT_WALKER = 10258,
SPELL_AWAKEN_EARTHEN_GUARDIAN = 10252,
};
CreatureAI* GetAI_boss_archaedas(Creature* pCreature)
class boss_archaedas : public CreatureScript
{
return new boss_archaedasAI (pCreature);
}
public:
boss_archaedas()
: CreatureScript("boss_archaedas")
{
}
struct boss_archaedasAI : public ScriptedAI
{
boss_archaedasAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
uint32 Tremor_Timer;
int32 Awaken_Timer;
uint32 WallMinionTimer;
bool wakingUp;
bool guardiansAwake;
bool vaultWalkersAwake;
ScriptedInstance* pInstance;
void Reset()
{
Tremor_Timer = 60000;
Awaken_Timer = 0;
WallMinionTimer = 10000;
wakingUp = false;
guardiansAwake = false;
vaultWalkersAwake = false;
if (pInstance)
pInstance->SetData (NULL, 5); // respawn any dead minions
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
void ActivateMinion (uint64 guid, bool flag)
{
Unit *minion = Unit::GetUnit(*me, guid);
if (minion && minion->isAlive())
{
DoCast (minion, SPELL_AWAKEN_VAULT_WALKER, flag);
minion->CastSpell(minion, SPELL_ARCHAEDAS_AWAKEN,true);
}
}
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->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)) {
me->MonsterYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
DoPlaySoundToSet(me,SOUND_AGGRO);
Awaken_Timer = 4000;
wakingUp = true;
}
}
void KilledUnit(Unit * /*victim*/)
{
me->MonsterYell(SAY_KILL,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_KILL);
}
void UpdateAI(const uint32 diff)
{
if (!pInstance)
return;
// 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(*me, pInstance->GetData64(0)));
return; // dont want to continue until we finish the AttackStart method
}
//Return since we have no target
if (!UpdateVictim())
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 && me->GetHealth()*100 / me->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
me->MonsterYell(SAY_SUMMON,LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_SUMMON);
guardiansAwake = true;
}
//If we are <33 summon the vault walkers
if (!vaultWalkersAwake && me->GetHealth()*100 / me->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
me->MonsterYell(SAY_SUMMON2, LANG_UNIVERSAL, NULL);
DoPlaySoundToSet(me, SOUND_SUMMON2);
vaultWalkersAwake = true;
}
if (Tremor_Timer <= diff)
{
//Cast
DoCast(me->getVictim(), SPELL_GROUND_TREMOR);
//45 seconds until we should cast this agian
Tremor_Timer = 45000;
} else Tremor_Timer -= diff;
DoMeleeAttackIfReady();
}
void JustDied (Unit *pKiller) {
if (pInstance)
{
pInstance->SetData(NULL,3); // open the vault door
pInstance->SetData(NULL,4); // deactivate his minions
}
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_archaedasAI(creature);
}
};
/* ScriptData
SDName: mob_archaedas_minions
@@ -200,149 +211,95 @@ SDComment: These mobs are initially frozen until Archaedas awakens them
one at a time.
EndScriptData */
#define SPELL_ARCHAEDAS_AWAKEN 10347
#define SPELL_ARCHAEDAS_AWAKEN 10347
struct mob_archaedas_minionsAI : public ScriptedAI
class mob_archaedas_minions : public CreatureScript
{
mob_archaedas_minionsAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
public:
uint32 Arcing_Timer;
int32 Awaken_Timer;
bool wakingUp;
bool amIAwake;
ScriptedInstance* pInstance;
void Reset()
{
Arcing_Timer = 3000;
Awaken_Timer = 0;
wakingUp = false;
amIAwake = false;
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->RemoveAllAuras();
}
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveAllAuras();
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->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(*me, pInstance->GetData64(0))); // whoWokeArchaedasGUID
return; // dont want to continue until we finish the AttackStart method
mob_archaedas_minions()
: CreatureScript("mob_archaedas_minions")
{
}
//Return since we have no target
if (!UpdateVictim())
return;
struct mob_archaedas_minionsAI : public ScriptedAI
{
mob_archaedas_minionsAI(Creature *c) : ScriptedAI(c)
{
pInstance = me->GetInstanceData();
}
DoMeleeAttackIfReady();
}
uint32 Arcing_Timer;
int32 Awaken_Timer;
bool wakingUp;
bool amIAwake;
ScriptedInstance* pInstance;
void Reset()
{
Arcing_Timer = 3000;
Awaken_Timer = 0;
wakingUp = false;
amIAwake = false;
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->RemoveAllAuras();
}
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveAllAuras();
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->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(*me, pInstance->GetData64(0))); // whoWokeArchaedasGUID
return; // dont want to continue until we finish the AttackStart method
}
//Return since we have no target
if (!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_archaedas_minionsAI(creature);
}
};
CreatureAI* GetAI_mob_archaedas_minions(Creature* pCreature)
{
return new mob_archaedas_minionsAI (pCreature);
}
/* ScriptData
SDName: go_altar_archaedas
SD%Complete: 100
SDComment: Needs 1 person to activate the Archaedas script
SDCategory: Uldaman
EndScriptData */
#define OBJECT_ALTAR_OF_ARCHAEDAS 133234
#define NUMBER_NEEDED_TO_ACTIVATE 1 // as of patch 3.0.8 the altars can be opened by a single player (previously 3)
#define SPELL_BOSS_OBJECT_VISUAL 11206
//uint64 altarOfArchaedasCount[5];
//int32 altarOfArchaedasCounter=0;
bool GOHello_go_altar_of_archaedas(Player* pPlayer, GameObject* /*pGo*/)
{
//bool alreadyUsed;
//pGo->AddUse ();
/*
alreadyUsed = false;
for (uint32 loop=0; loop<5; loop++) {
if (altarOfArchaedasCount[loop] == pPlayer->GetGUID()) alreadyUsed = true;
}
if (!alreadyUsed)
altarOfArchaedasCount[altarOfArchaedasCounter++] = pPlayer->GetGUID();
*/
pPlayer->CastSpell (pPlayer, 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
uint8 count = 0;
Unit *pTarget;
for (uint8 x = 0; x <= 5; ++x)
{
pTarget = Unit::GetUnit(*pPlayer, 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 = pPlayer->GetInstanceData();
if (!pInstance)
return false;
pInstance->SetData(NULL,0);
pInstance->SetData64(0,pPlayer->GetGUID()); // activate archaedas
return false;
}
/* ScriptData
SDName: mob_stonekeepers
SD%Complete: 100
@@ -350,57 +307,95 @@ SDComment: After activating the altar of the keepers, the stone keepers will
wake up one by one.
EndScriptData */
#include "ScriptPCH.h"
#define SPELL_SELF_DESTRUCT 9874
#define SPELL_SELF_DESTRUCT 9874
struct mob_stonekeepersAI : public ScriptedAI
class mob_stonekeepers : public CreatureScript
{
mob_stonekeepersAI(Creature *c) : ScriptedAI(c)
{
pInstance = (me->GetInstanceData());
}
public:
ScriptedInstance* pInstance;
mob_stonekeepers()
: CreatureScript("mob_stonekeepers")
{
}
void Reset()
{
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->RemoveAllAuras();
}
struct mob_stonekeepersAI : public ScriptedAI
{
mob_stonekeepersAI(Creature *c) : ScriptedAI(c)
{
pInstance = (me->GetInstanceData());
}
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
ScriptedInstance* pInstance;
void UpdateAI(const uint32 /*diff*/)
{
void Reset()
{
me->setFaction(35);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
me->RemoveAllAuras();
}
//Return since we have no target
if (!UpdateVictim())
return;
void EnterCombat(Unit * /*who*/)
{
me->setFaction (14);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
DoMeleeAttackIfReady();
}
void UpdateAI(const uint32 /*diff*/)
{
//Return since we have no target
if (!UpdateVictim())
return;
void JustDied(Unit * /*attacker*/)
{
DoCast (me, SPELL_SELF_DESTRUCT,true);
if (pInstance)
pInstance->SetData(NULL, 1); // activate next stonekeeper
}
DoMeleeAttackIfReady();
}
void JustDied(Unit * /*attacker*/)
{
DoCast (me, SPELL_SELF_DESTRUCT,true);
if (pInstance)
pInstance->SetData(NULL, 1); // activate next stonekeeper
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_stonekeepersAI(creature);
}
};
CreatureAI* GetAI_mob_stonekeepers(Creature* pCreature)
/* ScriptData
SDName: go_altar_archaedas
SD%Complete: 100
SDComment: Needs 1 person to activate the Archaedas script
SDCategory: Uldaman
EndScriptData */
#define SPELL_BOSS_OBJECT_VISUAL 11206
class go_altar_of_archaedas : public CreatureScript
{
return new mob_stonekeepersAI (pCreature);
}
public:
go_altar_of_archaedas()
: CreatureScript("go_altar_of_archaedas")
{
}
bool OnGossipHello(Player* pPlayer, GameObject* /*pGo*/)
{
ScriptedInstance* pInstance = pPlayer->GetInstanceData();
if (!pInstance)
return false;
pPlayer->CastSpell (pPlayer, SPELL_BOSS_OBJECT_VISUAL, false);
pInstance->SetData(NULL,0);
pInstance->SetData64(0,pPlayer->GetGUID()); // activate archaedas
return false;
}
};
/* ScriptData
SDName: go_altar_of_the_keepers
@@ -411,89 +406,36 @@ EndScriptData */
#define SPELL_BOSS_OBJECT_VISUAL 11206
#define NUMBER_NEEDED_TO_ACTIVATE 1 // as of patch 3.0.8 the altars can be opened by a single player (previously 3)
//static uint64 altarOfTheKeeperCount[5];
//static uint32 altarOfTheKeeperCounter=0;
bool GOHello_go_altar_of_the_keepers(Player* pPlayer, GameObject* /*pGo*/)
class go_altar_of_the_keepers : public CreatureScript
{
ScriptedInstance* pInstance = pPlayer->GetInstanceData();
if (!pInstance)
return true;
public:
//bool alreadyUsed;
go_altar_of_the_keepers()
: CreatureScript("go_altar_of_the_keepers")
{
}
//pGo->AddUse();
bool OnGossipHello(Player* pPlayer, GameObject* /*pGo*/)
{
ScriptedInstance* pInstance = pPlayer->GetInstanceData();
if (!pInstance)
return false;
//alreadyUsed = false;
//for (uint32 loop=0; loop<5; ++loop)
//{
// if (altarOfTheKeeperCount[loop] == pPlayer->GetGUID())
//alreadyUsed = true;
//}
//if (!alreadyUsed && altarOfTheKeeperCounter < 5)
// altarOfTheKeeperCount[altarOfTheKeeperCounter++] = pPlayer->GetGUID();
pPlayer->CastSpell (pPlayer, SPELL_BOSS_OBJECT_VISUAL, false);
pPlayer->CastSpell (pPlayer, SPELL_BOSS_OBJECT_VISUAL, false);
//if (altarOfTheKeeperCounter < NUMBER_NEEDED_TO_ACTIVATE)
//{
//sLog.outError("not enough people yet, altarOfTheKeeperCounter = %d", altarOfTheKeeperCounter);
// return false; // not enough people yet
//}
/*
// Check to make sure at least three people are still casting
uint8 count = 0;
Unit *pTarget;
for (uint8 x = 0; x < 5; ++x)
{
pTarget = Unit::GetUnit(*pPlayer, altarOfTheKeeperCount[x]);
//sLog.outError("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)
{
//sLog.outError("still not enough people");
return true; // not enough people
}
*/
//sLog.outError ("activating stone keepers");
pInstance->SetData(NULL,1); // activate the Stone Keepers
return true;
}
pInstance->SetData(NULL,1); // activate the Stone Keepers
return false;
}
};
//This is the actual function called only once durring InitScripts()
//It must define all handled functions that are to be run in this script
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();
new boss_archaedas();
new mob_archaedas_minions();
new mob_stonekeepers();
new go_altar_of_archaedas();
new go_altar_of_the_keepers();
}

View File

@@ -31,78 +31,85 @@ EndScriptData */
#define SPELL_KNOCKAWAY 10101
#define SPELL_WSTOMP 11876
struct boss_ironayaAI : public ScriptedAI
class boss_ironaya : public CreatureScript
{
boss_ironayaAI(Creature *c) : ScriptedAI(c) {}
public:
uint32 Arcing_Timer;
bool hasCastedWstomp;
bool hasCastedKnockaway;
void Reset()
{
Arcing_Timer = 3000;
hasCastedKnockaway = false;
hasCastedWstomp = false;
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(SAY_AGGRO, me);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
//If we are <50% hp do knockaway ONCE
if (!hasCastedKnockaway && me->GetHealth()*2 < me->GetMaxHealth())
boss_ironaya()
: CreatureScript("boss_ironaya")
{
DoCast(me->getVictim(), SPELL_KNOCKAWAY, true);
// current aggro target is knocked away pick new target
Unit* Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
if (!Target || Target == me->getVictim())
Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);
if (Target)
me->TauntApply(Target);
//Shouldn't cast this agian
hasCastedKnockaway = true;
}
//Arcing_Timer
if (Arcing_Timer <= diff)
struct boss_ironayaAI : public ScriptedAI
{
DoCast(me, SPELL_ARCINGSMASH);
Arcing_Timer = 13000;
} else Arcing_Timer -= diff;
boss_ironayaAI(Creature *c) : ScriptedAI(c) {}
if (!hasCastedWstomp && me->GetHealth()*4 < me->GetMaxHealth())
uint32 Arcing_Timer;
bool hasCastedWstomp;
bool hasCastedKnockaway;
void Reset()
{
Arcing_Timer = 3000;
hasCastedKnockaway = false;
hasCastedWstomp = false;
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(SAY_AGGRO, me);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
//If we are <50% hp do knockaway ONCE
if (!hasCastedKnockaway && me->GetHealth()*2 < me->GetMaxHealth())
{
DoCast(me->getVictim(), SPELL_KNOCKAWAY, true);
// current aggro target is knocked away pick new target
Unit* Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
if (!Target || Target == me->getVictim())
Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 1);
if (Target)
me->TauntApply(Target);
//Shouldn't cast this agian
hasCastedKnockaway = true;
}
//Arcing_Timer
if (Arcing_Timer <= diff)
{
DoCast(me, SPELL_ARCINGSMASH);
Arcing_Timer = 13000;
} else Arcing_Timer -= diff;
if (!hasCastedWstomp && me->GetHealth()*4 < me->GetMaxHealth())
{
DoCast(me, SPELL_WSTOMP);
hasCastedWstomp = true;
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
DoCast(me, SPELL_WSTOMP);
hasCastedWstomp = true;
return new boss_ironayaAI(creature);
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_ironaya(Creature* pCreature)
{
return new boss_ironayaAI (pCreature);
}
//This is the actual function called only once durring InitScripts()
//It must define all handled functions that are to be run in this script
void AddSC_boss_ironaya()
{
Script *newscript;
newscript = new Script;
newscript->Name = "boss_ironaya";
newscript->GetAI = &GetAI_boss_ironaya;
newscript->RegisterSelf();
}
new boss_ironaya();
}

View File

@@ -17,286 +17,286 @@
*/
#include "ScriptPCH.h"
#include "uldaman.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 instance_uldaman : public ScriptedInstance
enum eSpells
{
instance_uldaman(Map* pMap) : ScriptedInstance(pMap)
{
Initialize();
};
void Initialize()
{
archaedasGUID = 0;
altarOfTheKeeperTempleDoor = 0;
archaedasTempleDoor = 0;
ancientVaultDoor = 0;
whoWokeArchaedasGUID = 0;
}
uint64 archaedasGUID;
uint64 altarOfTheKeeperTempleDoor;
uint64 archaedasTempleDoor;
uint64 ancientVaultDoor;
uint64 whoWokeArchaedasGUID;
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 OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch (pGo->GetEntry())
{
case ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
altarOfTheKeeperTempleDoor = pGo->GetGUID();
break;
case ARCHAEDAS_TEMPLE_DOOR:
archaedasTempleDoor = pGo->GetGUID();
break;
case ANCIENT_VAULT_DOOR:
pGo->SetGoState(GO_STATE_READY);
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
ancientVaultDoor = pGo->GetGUID();
break;
}
}
void SetFrozenState(Creature* pCreature)
{
pCreature->setFaction(35);
pCreature->RemoveAllAuras();
//creature->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_ANIMATION_FROZEN);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
void OpenDoor(uint64 guid)
{
GameObject* pGo = instance->GetGameObject(guid);
if (!pGo)
return;
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
pGo->SetGoState(GO_STATE_ACTIVE);
}
void ActivateStoneKeepers()
{
for (std::vector<uint64>::const_iterator i = stoneKeeper.begin(); i != stoneKeeper.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
continue;
pTarget->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
pTarget->setFaction(14);
pTarget->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
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);
}
void ActivateWallMinions()
{
Creature *archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
continue;
archaedas->CastSpell(pTarget, SPELL_AWAKEN_VAULT_WALKER, true);
pTarget->CastSpell(pTarget, SPELL_ARCHAEDAS_AWAKEN,true);
return; // only want the first one we find
}
}
// used when Archaedas dies. All active minions must be despawned.
void DeActivateMinions()
{
// first despawn any aggroed wall minions
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
// Vault Walkers
for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
// Earthen Guardians
for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
}
void ActivateArchaedas(uint64 target)
{
Creature *archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
if (Unit *victim = Unit::GetUnit(*archaedas, target))
{
archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN,false);
whoWokeArchaedasGUID = target;
}
}
void RespawnMinions()
{
// first respawn any aggroed wall minions
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
// Vault Walkers
for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
// Earthen Guardians
for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
}
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();
}
void SetData64 (uint32 type, uint64 data)
{
// Archaedas
if (type == 0)
{
ActivateArchaedas (data);
}
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch (pCreature->GetEntry()) {
case 4857: // Stone Keeper
SetFrozenState (pCreature);
stoneKeeper.push_back(pCreature->GetGUID());
break;
case 7309: // Earthen Custodian
archaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7077: // Earthen Hallshaper
archaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7076: // Earthen Guardian
earthenGuardian.push_back(pCreature->GetGUID());
break;
case 10120: // Vault Walker
vaultWalker.push_back(pCreature->GetGUID());
break;
case 2748: // Archaedas
archaedasGUID = pCreature->GetGUID();
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
SPELL_ARCHAEDAS_AWAKEN = 10347,
SPELL_AWAKEN_VAULT_WALKER = 10258,
};
InstanceData* GetInstanceData_instance_uldaman(Map* pMap)
{
return new instance_uldaman(pMap);
}
class instance_uldaman : public InstanceMapScript
{
public:
instance_uldaman()
: InstanceMapScript("instance_uldaman")
{
}
struct instance_uldaman_InstanceMapScript : public ScriptedInstance
{
instance_uldaman_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap)
{
Initialize();
};
void AddSC_instance_uldaman()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_uldaman";
newscript->GetInstanceData = &GetInstanceData_instance_uldaman;
newscript->RegisterSelf();
}
void Initialize()
{
archaedasGUID = 0;
altarOfTheKeeperTempleDoor = 0;
archaedasTempleDoor = 0;
ancientVaultDoor = 0;
whoWokeArchaedasGUID = 0;
}
uint64 archaedasGUID;
uint64 altarOfTheKeeperTempleDoor;
uint64 archaedasTempleDoor;
uint64 ancientVaultDoor;
uint64 whoWokeArchaedasGUID;
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 OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch (pGo->GetEntry())
{
case GO_ALTAR_OF_THE_KEEPER_TEMPLE_DOOR: // lock the door
altarOfTheKeeperTempleDoor = pGo->GetGUID();
break;
case GO_ARCHAEDAS_TEMPLE_DOOR:
archaedasTempleDoor = pGo->GetGUID();
break;
case GO_ANCIENT_VAULT_DOOR:
pGo->SetGoState(GO_STATE_READY);
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
ancientVaultDoor = pGo->GetGUID();
break;
}
}
void SetFrozenState(Creature* pCreature)
{
pCreature->setFaction(35);
pCreature->RemoveAllAuras();
//creature->RemoveFlag (UNIT_FIELD_FLAGS,UNIT_FLAG_ANIMATION_FROZEN);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
pCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
}
void OpenDoor(uint64 guid)
{
GameObject* pGo = instance->GetGameObject(guid);
if (!pGo)
return;
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 33);
pGo->SetGoState(GO_STATE_ACTIVE);
}
void ActivateStoneKeepers()
{
for (std::vector<uint64>::const_iterator i = stoneKeeper.begin(); i != stoneKeeper.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
continue;
pTarget->RemoveFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_DISABLE_MOVE);
pTarget->setFaction(14);
pTarget->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
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);
}
void ActivateWallMinions()
{
Creature *archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || !pTarget->isAlive() || pTarget->getFaction() == 14)
continue;
archaedas->CastSpell(pTarget, SPELL_AWAKEN_VAULT_WALKER, true);
pTarget->CastSpell(pTarget, SPELL_ARCHAEDAS_AWAKEN,true);
return; // only want the first one we find
}
}
// used when Archaedas dies. All active minions must be despawned.
void DeActivateMinions()
{
// first despawn any aggroed wall minions
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
// Vault Walkers
for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
// Earthen Guardians
for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (!pTarget || pTarget->isDead() || pTarget->getFaction() != 14)
continue;
pTarget->setDeathState(JUST_DIED);
pTarget->RemoveCorpse();
}
}
void ActivateArchaedas(uint64 target)
{
Creature *archaedas = instance->GetCreature(archaedasGUID);
if (!archaedas)
return;
if (Unit *victim = Unit::GetUnit(*archaedas, target))
{
archaedas->CastSpell(archaedas, SPELL_ARCHAEDAS_AWAKEN,false);
whoWokeArchaedasGUID = target;
}
}
void RespawnMinions()
{
// first respawn any aggroed wall minions
for (std::vector<uint64>::const_iterator i = archaedasWallMinions.begin(); i != archaedasWallMinions.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
// Vault Walkers
for (std::vector<uint64>::const_iterator i = vaultWalker.begin(); i != vaultWalker.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
// Earthen Guardians
for (std::vector<uint64>::const_iterator i = earthenGuardian.begin(); i != earthenGuardian.end(); ++i)
{
Creature *pTarget = instance->GetCreature(*i);
if (pTarget && pTarget->isDead())
{
pTarget->Respawn();
pTarget->GetMotionMaster()->MoveTargetedHome();
SetFrozenState(pTarget);
}
}
}
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();
}
void SetData64 (uint32 type, uint64 data)
{
// Archaedas
if (type == 0)
{
ActivateArchaedas (data);
}
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch (pCreature->GetEntry()) {
case 4857: // Stone Keeper
SetFrozenState (pCreature);
stoneKeeper.push_back(pCreature->GetGUID());
break;
case 7309: // Earthen Custodian
archaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7077: // Earthen Hallshaper
archaedasWallMinions.push_back(pCreature->GetGUID());
break;
case 7076: // Earthen Guardian
earthenGuardian.push_back(pCreature->GetGUID());
break;
case 10120: // Vault Walker
vaultWalker.push_back(pCreature->GetGUID());
break;
case 2748: // Archaedas
archaedasGUID = pCreature->GetGUID();
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* OnGetInstanceData(InstanceMap* pMap)
{
return new instance_uldaman_InstanceMapScript(pMap);
}
};
void AddSC_instance_uldaman()
{
new instance_uldaman;
}

View File

@@ -34,57 +34,69 @@ EndContentData */
## mob_jadespine_basilisk
######*/
#define SPELL_CSLUMBER 3636
struct mob_jadespine_basiliskAI : public ScriptedAI
enum eSpells
{
mob_jadespine_basiliskAI(Creature *c) : ScriptedAI(c) {}
uint32 Cslumber_Timer;
void Reset()
{
Cslumber_Timer = 2000;
}
void EnterCombat(Unit * /*who*/)
{
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
//Cslumber_Timer
if (Cslumber_Timer <= diff)
{
//Cast
// DoCast(me->getVictim(), SPELL_CSLUMBER);
DoCast(me->getVictim(), SPELL_CSLUMBER, true);
//Stop attacking target thast asleep and pick new target
Cslumber_Timer = 28000;
Unit* Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
if (!Target || Target == me->getVictim())
Target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (Target)
me->TauntApply(Target);
} else Cslumber_Timer -= diff;
DoMeleeAttackIfReady();
}
SPELL_CRYSTALLINE_SLUMBER = 3636,
};
CreatureAI* GetAI_mob_jadespine_basilisk(Creature* pCreature)
class mob_jadespine_basilisk : public CreatureScript
{
return new mob_jadespine_basiliskAI (pCreature);
}
public:
mob_jadespine_basilisk()
: CreatureScript("mob_jadespine_basilisk")
{
}
struct mob_jadespine_basiliskAI : public ScriptedAI
{
mob_jadespine_basiliskAI(Creature *c) : ScriptedAI(c) {}
uint32 Cslumber_Timer;
void Reset()
{
Cslumber_Timer = 2000;
}
void EnterCombat(Unit * /*who*/)
{
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
//Cslumber_Timer
if (Cslumber_Timer <= diff)
{
//Cast
DoCastVictim(SPELL_CRYSTALLINE_SLUMBER, true);
//Stop attacking target thast asleep and pick new target
Cslumber_Timer = 28000;
Unit* Target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0);
if (!Target || Target == me->getVictim())
Target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true);
if (Target)
me->TauntApply(Target);
} else Cslumber_Timer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_jadespine_basiliskAI(creature);
}
};
/*######
## npc_lore_keeper_of_norgannon
@@ -107,101 +119,101 @@ CreatureAI* GetAI_mob_jadespine_basilisk(Creature* pCreature)
#define GOSSIP_SELECT_KEEPER14 "This is a lot to think about."
#define GOSSIP_SELECT_KEEPER15 "I will access the discs now."
bool GossipHello_npc_lore_keeper_of_norgannon(Player* pPlayer, Creature* pCreature)
class npc_lore_keeper_of_norgannon : public CreatureScript
{
if (pPlayer->GetQuestStatus(2278) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_KEEPER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
public:
pPlayer->SEND_GOSSIP_MENU(1079, pCreature->GetGUID());
npc_lore_keeper_of_norgannon()
: CreatureScript("npc_lore_keeper_of_norgannon")
{
}
return true;
}
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
{
if (pPlayer->GetQuestStatus(2278) == QUEST_STATUS_INCOMPLETE)
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HELLO_KEEPER, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
bool GossipSelect_npc_lore_keeper_of_norgannon(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(1080, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->SEND_GOSSIP_MENU(1081, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
pPlayer->SEND_GOSSIP_MENU(1082, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
pPlayer->SEND_GOSSIP_MENU(1083, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
pPlayer->SEND_GOSSIP_MENU(1084, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+6:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
pPlayer->SEND_GOSSIP_MENU(1085, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+7:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+8);
pPlayer->SEND_GOSSIP_MENU(1086, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+8:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9);
pPlayer->SEND_GOSSIP_MENU(1087, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+9:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+10);
pPlayer->SEND_GOSSIP_MENU(1088, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+10:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+11);
pPlayer->SEND_GOSSIP_MENU(1089, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+11:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+12);
pPlayer->SEND_GOSSIP_MENU(1090, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+12:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER12, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+13);
pPlayer->SEND_GOSSIP_MENU(1091, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+13:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER13, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+14);
pPlayer->SEND_GOSSIP_MENU(1092, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+14:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER14, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+15);
pPlayer->SEND_GOSSIP_MENU(1093, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+15:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER15, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+16);
pPlayer->SEND_GOSSIP_MENU(1094, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+16:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->AreaExploredOrEventHappens(2278);
break;
}
return true;
}
pPlayer->SEND_GOSSIP_MENU(1079, pCreature->GetGUID());
return true;
}
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 uiAction)
{
switch (uiAction)
{
case GOSSIP_ACTION_INFO_DEF+1:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
pPlayer->SEND_GOSSIP_MENU(1080, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+2:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
pPlayer->SEND_GOSSIP_MENU(1081, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+3:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
pPlayer->SEND_GOSSIP_MENU(1082, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+4:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
pPlayer->SEND_GOSSIP_MENU(1083, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+5:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
pPlayer->SEND_GOSSIP_MENU(1084, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+6:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
pPlayer->SEND_GOSSIP_MENU(1085, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+7:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+8);
pPlayer->SEND_GOSSIP_MENU(1086, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+8:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9);
pPlayer->SEND_GOSSIP_MENU(1087, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+9:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+10);
pPlayer->SEND_GOSSIP_MENU(1088, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+10:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+11);
pPlayer->SEND_GOSSIP_MENU(1089, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+11:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+12);
pPlayer->SEND_GOSSIP_MENU(1090, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+12:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER12, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+13);
pPlayer->SEND_GOSSIP_MENU(1091, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+13:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER13, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+14);
pPlayer->SEND_GOSSIP_MENU(1092, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+14:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER14, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+15);
pPlayer->SEND_GOSSIP_MENU(1093, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+15:
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT_KEEPER15, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+16);
pPlayer->SEND_GOSSIP_MENU(1094, pCreature->GetGUID());
break;
case GOSSIP_ACTION_INFO_DEF+16:
pPlayer->CLOSE_GOSSIP_MENU();
pPlayer->AreaExploredOrEventHappens(2278);
break;
}
return true;
}
};
void AddSC_uldaman()
{
Script *newscript;
newscript = new Script;
newscript->Name = "mob_jadespine_basilisk";
newscript->GetAI = &GetAI_mob_jadespine_basilisk;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "npc_lore_keeper_of_norgannon";
newscript->pGossipHello = &GossipHello_npc_lore_keeper_of_norgannon;
newscript->pGossipSelect = &GossipSelect_npc_lore_keeper_of_norgannon;
newscript->RegisterSelf();
new mob_jadespine_basilisk();
new npc_lore_keeper_of_norgannon();
}