*Fix prison Containment Spheres in Keristrasza.

--HG--
branch : trunk
This commit is contained in:
Anubisss
2009-08-11 04:57:09 +02:00
parent 1beff219b8
commit c1c8333642
8 changed files with 216 additions and 85 deletions

View File

@@ -701,6 +701,7 @@ UPDATE `creature_template` SET `ScriptName`='boss_ormorok' WHERE `entry`=26794;
UPDATE `creature_template` SET `ScriptName`='mob_crystal_spike' WHERE `entry`=27099;
UPDATE `creature_template` SET `ScriptName`='mob_crystalline_tangler' WHERE `entry`=32665;
UPDATE `creature_template` SET `ScriptName`='boss_keristrasza' WHERE `entry`=26723;
UPDATE `gameobject_template` SET `ScriptName`='containment_sphere' WHERE `entry` IN (188527, 188528, 188526);
/* OBSIDIAN SANCTUM */
UPDATE `instance_template` SET `script`='instance_obsidian_sanctum' WHERE map=615;

View File

@@ -0,0 +1 @@
UPDATE `gameobject_template` SET `ScriptName` = 'containment_sphere' WHERE `entry` IN (188527, 188528, 188526);

View File

@@ -93,6 +93,9 @@ struct TRINITY_DLL_DECL boss_anomalusAI : public ScriptedAI
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_ANOMALUS_EVENT, IN_PROGRESS);
}
void JustDied(Unit* killer)

View File

@@ -26,6 +26,8 @@ EndScriptData */
enum
{
CONTAINMENT_SPHERES = 3,
ACHIEVEMENT_INTENSE_COLD = 2036,
//Spells
@@ -40,11 +42,11 @@ enum
SPELL_INTENSE_COLD_TRIGGERED = 48095,
//Yell
SAY_AGGRO = -1576040,
SAY_SLAY = -1576041,
SAY_ENRAGE = -1576042,
SAY_DEATH = -1576043,
SAY_CRYSTAL_NOVA = -1576044
SAY_AGGRO = -1576040,
SAY_SLAY = -1576041,
SAY_ENRAGE = -1576042,
SAY_DEATH = -1576043,
SAY_CRYSTAL_NOVA = -1576044
};
struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
@@ -63,6 +65,8 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
uint32 TAIL_SWEEP_Timer;
bool Enrage;
uint64 ContainmentSphereGUIDs[CONTAINMENT_SPHERES];
uint32 CheckIntenseColdTimer;
bool MoreThanTwoIntenseCold; // needed for achievement: Intense Cold(2036)
@@ -76,46 +80,27 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
CheckIntenseColdTimer = 2000;
MoreThanTwoIntenseCold = false;
m_creature->RemoveAurasDueToSpell(SPELL_INTENSE_COLD);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) == DONE)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}else{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->CastSpell(m_creature, SPELL_FROZEN_PRISON, false);
}
}
void MoveInLineOfSight(Unit *who)
{
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) != DONE && pInstance->GetData(DATA_MAGUS_TELESTRA_EVENT) == DONE &&
pInstance->GetData(DATA_ANOMALUS_EVENT) == DONE && pInstance->GetData(DATA_ORMOROK_EVENT) == DONE &&
m_creature->IsHostileTo(who) && m_creature->IsWithinDist(who, 15.0f, false))
{
pInstance->SetData(DATA_KERISTRASZA_FREED, DONE);
}
if (pInstance && pInstance->GetData(DATA_KERISTRASZA_FREED) == DONE)
{
m_creature->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
ScriptedAI::MoveInLineOfSight(who);
}
RemovePrison(CheckContainmentSpheres());
if(pInstance)
pInstance->SetData(DATA_KERISTRASZA_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoCast(m_creature, SPELL_INTENSE_COLD);
DoCastAOE(SPELL_INTENSE_COLD);
if(pInstance)
pInstance->SetData(DATA_KERISTRASZA_EVENT, IN_PROGRESS);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if(HeroicMode && !MoreThanTwoIntenseCold)
{
AchievementEntry const *AchievIntenseCold = GetAchievementStore()->LookupEntry(ACHIEVEMENT_INTENSE_COLD);
@@ -130,6 +115,9 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
}
}
}
if(pInstance)
pInstance->SetData(DATA_KERISTRASZA_EVENT, DONE);
}
void KilledUnit(Unit *victim)
@@ -137,6 +125,44 @@ struct TRINITY_DLL_DECL boss_keristraszaAI : public ScriptedAI
DoScriptText(SAY_SLAY, m_creature);
}
bool CheckContainmentSpheres(bool remove_prison = false)
{
ContainmentSphereGUIDs[0] = pInstance->GetData64(ANOMALUS_CONTAINMET_SPHERE);
ContainmentSphereGUIDs[1] = pInstance->GetData64(ORMOROKS_CONTAINMET_SPHERE);
ContainmentSphereGUIDs[2] = pInstance->GetData64(TELESTRAS_CONTAINMET_SPHERE);
GameObject *ContainmentSpheres[CONTAINMENT_SPHERES];
for(uint8 i = 0; i < CONTAINMENT_SPHERES; i++)
{
ContainmentSpheres[i] = pInstance->instance->GetGameObject(ContainmentSphereGUIDs[i]);
if(!ContainmentSpheres[i])
return false;
if(ContainmentSpheres[i]->GetGoState() != GO_STATE_ACTIVE)
return false;
}
if(remove_prison)
RemovePrison(true);
return true;
}
void RemovePrison(bool remove)
{
if(remove)
{
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
if(m_creature->HasAura(SPELL_FROZEN_PRISON))
m_creature->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON);
}
else
{
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_ATTACKABLE_2);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
m_creature->CastSpell(m_creature, SPELL_FROZEN_PRISON, false);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
@@ -200,12 +226,33 @@ CreatureAI* GetAI_boss_keristrasza(Creature *_Creature)
return new boss_keristraszaAI (_Creature);
}
bool GOHello_containment_sphere(Player *pPlayer, GameObject *pGO)
{
ScriptedInstance *pInstance = pGO->GetInstanceData();
Creature *Keristrasza = Unit::GetCreature(*pGO, pInstance->GetData64(DATA_KERISTRASZA));
if(Keristrasza && Keristrasza->isAlive())
{
// maybe these are hacks :(
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
pGO->SetGoState(GO_STATE_ACTIVE);
CAST_AI(boss_keristraszaAI, Keristrasza->AI())->CheckContainmentSpheres(true);
}
return true;
}
void AddSC_boss_keristrasza()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_keristrasza";
newscript->Name = "boss_keristrasza";
newscript->GetAI = &GetAI_boss_keristrasza;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "containment_sphere";
newscript->pGOHello = &GOHello_containment_sphere;
newscript->RegisterSelf();
}

View File

@@ -62,7 +62,6 @@ struct TRINITY_DLL_DECL boss_magus_telestraAI : public ScriptedAI
boss_magus_telestraAI(Creature* c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
Reset();
HeroicMode = c->GetMap()->IsHeroic();
}
@@ -111,6 +110,22 @@ struct TRINITY_DLL_DECL boss_magus_telestraAI : public ScriptedAI
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
if(pInstance)
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, IN_PROGRESS);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
}
uint64 SplitPersonality(uint32 entry)
@@ -284,18 +299,6 @@ struct TRINITY_DLL_DECL boss_magus_telestraAI : public ScriptedAI
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
}
};
CreatureAI* GetAI_boss_magus_telestra(Creature *_Creature)

View File

@@ -58,7 +58,6 @@ struct TRINITY_DLL_DECL boss_ormorokAI : public ScriptedAI
boss_ormorokAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
Reset();
HeroicMode = c->GetMap()->IsHeroic();
}
@@ -88,6 +87,7 @@ struct TRINITY_DLL_DECL boss_ormorokAI : public ScriptedAI
SPELL_SUMMON_CRYSTALLINE_TANGLER_Timer = 17000;
Frenzy = false;
CrystalSpikes = false;
if(pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, NOT_STARTED);
}
@@ -95,6 +95,22 @@ struct TRINITY_DLL_DECL boss_ormorokAI : public ScriptedAI
void EnterCombat(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, IN_PROGRESS);
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
}
void UpdateAI(const uint32 diff)
@@ -195,26 +211,12 @@ struct TRINITY_DLL_DECL boss_ormorokAI : public ScriptedAI
DoMeleeAttackIfReady();
}
void JustDied(Unit* killer)
{
DoScriptText(SAY_DEATH, m_creature);
if (pInstance)
pInstance->SetData(DATA_ORMOROK_EVENT, DONE);
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
}
};
struct TRINITY_DLL_DECL mob_crystal_spikeAI : public Scripted_NoMovementAI
{
mob_crystal_spikeAI(Creature *c) : Scripted_NoMovementAI(c)
{
Reset();
HeroicMode = c->GetMap()->IsHeroic();
}
@@ -251,10 +253,7 @@ struct TRINITY_DLL_DECL mob_crystal_spikeAI : public Scripted_NoMovementAI
struct TRINITY_DLL_DECL mob_crystalline_tanglerAI : public ScriptedAI
{
mob_crystalline_tanglerAI(Creature *c) : ScriptedAI(c)
{
Reset();
}
mob_crystalline_tanglerAI(Creature *c) : ScriptedAI(c) {}
uint32 SPELL_ROOTS_Timer;
@@ -297,7 +296,7 @@ void AddSC_boss_ormorok()
newscript = new Script;
newscript->Name="boss_ormorok";
newscript->GetAI = GetAI_boss_ormorok;
newscript->GetAI = &GetAI_boss_ormorok;
newscript->RegisterSelf();
newscript = new Script;

View File

@@ -1,11 +1,19 @@
#ifndef DEF_NEXUS_H
#define DEF_NEXUS_H
#define DATA_MAGUS_TELESTRA_EVENT 1
#define DATA_ANOMALUS_EVENT 2
#define DATA_ORMOROK_EVENT 3
#define DATA_KERISTRASZA_FREED 4
enum
{
DATA_MAGUS_TELESTRA_EVENT,
DATA_ANOMALUS_EVENT,
DATA_ORMOROK_EVENT,
DATA_KERISTRASZA_EVENT,
#define DATA_ANOMALUS 5
DATA_ANOMALUS,
DATA_KERISTRASZA,
ANOMALUS_CONTAINMET_SPHERE,
ORMOROKS_CONTAINMET_SPHERE,
TELESTRAS_CONTAINMET_SPHERE
};
#endif

View File

@@ -28,11 +28,18 @@ EndScriptData */
struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
{
instance_nexus(Map *Map) : ScriptedInstance(Map) {Initialize();};
instance_nexus(Map *Map) : ScriptedInstance(Map) { Initialize(); }
uint32 Encounters[NUMBER_OF_ENCOUNTERS];
uint64 Anomalus;
uint64 Keristrasza;
uint64 AnomalusContainmentSphere;
uint64 OrmoroksContainmentSphere;
uint64 TelestrasContainmentSphere;
std::string strInstData;
uint64 Anomalus;
uint32 Encounters[NUMBER_OF_ENCOUNTERS];
void Initialize()
{
@@ -56,6 +63,7 @@ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
switch(pCreature->GetEntry())
{
case 26763: Anomalus = pCreature->GetGUID(); break;
case 26723: Keristrasza = pCreature->GetGUID(); break;
case 26800:
{
//26799
@@ -99,14 +107,32 @@ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
}
}
uint64 GetData64(uint32 uiIdentifier)
void OnGameObjectCreate(GameObject *go, bool add)
{
switch(uiIdentifier)
switch(go->GetEntry())
{
case DATA_ANOMALUS:
return Anomalus;
case 188527:
{
AnomalusContainmentSphere = go->GetGUID();
if(Encounters[1] == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
case 188528:
{
OrmoroksContainmentSphere = go->GetGUID();
if(Encounters[2] == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
case 188526:
{
TelestrasContainmentSphere = go->GetGUID();
if(Encounters[0] == DONE)
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
break;
}
}
return 0;
}
uint32 GetData(uint32 identifier)
@@ -116,7 +142,7 @@ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
case DATA_MAGUS_TELESTRA_EVENT: return Encounters[0];
case DATA_ANOMALUS_EVENT: return Encounters[1];
case DATA_ORMOROK_EVENT: return Encounters[2];
case DATA_KERISTRASZA_FREED: return Encounters[3];
case DATA_KERISTRASZA_EVENT: return Encounters[3];
}
return 0;
}
@@ -125,10 +151,40 @@ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
{
switch(identifier)
{
case DATA_MAGUS_TELESTRA_EVENT: Encounters[0] = data; break;
case DATA_ANOMALUS_EVENT: Encounters[1] = data; break;
case DATA_ORMOROK_EVENT: Encounters[2] = data; break;
case DATA_KERISTRASZA_FREED: Encounters[3] = data; break;
case DATA_MAGUS_TELESTRA_EVENT:
{
if(data == DONE)
{
GameObject *Sphere = instance->GetGameObject(TelestrasContainmentSphere);
if(Sphere)
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
Encounters[0] = data;
break;
}
case DATA_ANOMALUS_EVENT:
{
if(data == DONE)
{
GameObject *Sphere = instance->GetGameObject(AnomalusContainmentSphere);
if(Sphere)
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
Encounters[1] = data;
break;
}
case DATA_ORMOROK_EVENT:
{
if(data == DONE)
{
GameObject *Sphere = instance->GetGameObject(OrmoroksContainmentSphere);
if(Sphere)
Sphere->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_UNK1);
}
Encounters[2] = data;
break;
}
case DATA_KERISTRASZA_EVENT: Encounters[3] = data; break;
}
if (data == DONE)
@@ -146,6 +202,19 @@ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance
}
}
uint64 GetData64(uint32 uiIdentifier)
{
switch(uiIdentifier)
{
case DATA_ANOMALUS: return Anomalus;
case DATA_KERISTRASZA: return Keristrasza;
case ANOMALUS_CONTAINMET_SPHERE: return AnomalusContainmentSphere;
case ORMOROKS_CONTAINMET_SPHERE: return OrmoroksContainmentSphere;
case TELESTRAS_CONTAINMET_SPHERE: return TelestrasContainmentSphere;
}
return 0;
}
std::string GetSaveData()
{
return strInstData;