diff options
author | Anubisss <none@none> | 2009-08-11 04:57:09 +0200 |
---|---|---|
committer | Anubisss <none@none> | 2009-08-11 04:57:09 +0200 |
commit | c1c8333642c29e6d3f285a4e62b73590f9f863ea (patch) | |
tree | f01c28a81c114c5579e157b86e13bc7cadc1f7ea | |
parent | 1beff219b8f5f15255413ea1fdb53a03291f42d6 (diff) |
*Fix prison Containment Spheres in Keristrasza.
--HG--
branch : trunk
8 files changed, 216 insertions, 85 deletions
diff --git a/sql/FULL/world_scripts_full.sql b/sql/FULL/world_scripts_full.sql index 8f7b8bd4c4a..9e5fa68110f 100644 --- a/sql/FULL/world_scripts_full.sql +++ b/sql/FULL/world_scripts_full.sql @@ -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; diff --git a/sql/updates/4892_world_script.sql b/sql/updates/4892_world_script.sql new file mode 100644 index 00000000000..2c950099530 --- /dev/null +++ b/sql/updates/4892_world_script.sql @@ -0,0 +1 @@ +UPDATE `gameobject_template` SET `ScriptName` = 'containment_sphere' WHERE `entry` IN (188527, 188528, 188526); diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_anomalus.cpp b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_anomalus.cpp index 5202e7550bb..d2469c53a8e 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_anomalus.cpp +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_anomalus.cpp @@ -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) diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_keristrasza.cpp b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_keristrasza.cpp index dbfd561ed78..3672f0ed6aa 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_keristrasza.cpp +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_keristrasza.cpp @@ -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(); } diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_magus_telestra.cpp b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_magus_telestra.cpp index 5d4cea91049..b3bfee11a66 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_magus_telestra.cpp +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_magus_telestra.cpp @@ -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) diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_ormorok.cpp b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_ormorok.cpp index 1cda12197a2..8e4164d2966 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/boss_ormorok.cpp +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/boss_ormorok.cpp @@ -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; diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/def_nexus.h b/src/bindings/scripts/scripts/zone/nexus/nexus/def_nexus.h index 59fb3528f69..678e44e5bbe 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/def_nexus.h +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/def_nexus.h @@ -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 diff --git a/src/bindings/scripts/scripts/zone/nexus/nexus/instance_nexus.cpp b/src/bindings/scripts/scripts/zone/nexus/nexus/instance_nexus.cpp index f46d503a6b4..b7e3862b3ad 100644 --- a/src/bindings/scripts/scripts/zone/nexus/nexus/instance_nexus.cpp +++ b/src/bindings/scripts/scripts/zone/nexus/nexus/instance_nexus.cpp @@ -28,12 +28,19 @@ EndScriptData */ struct TRINITY_DLL_DECL instance_nexus : public ScriptedInstance { - instance_nexus(Map *Map) : ScriptedInstance(Map) {Initialize();}; + instance_nexus(Map *Map) : ScriptedInstance(Map) { Initialize(); } - std::string strInstData; - uint64 Anomalus; uint32 Encounters[NUMBER_OF_ENCOUNTERS]; + uint64 Anomalus; + uint64 Keristrasza; + + uint64 AnomalusContainmentSphere; + uint64 OrmoroksContainmentSphere; + uint64 TelestrasContainmentSphere; + + std::string strInstData; + void Initialize() { Anomalus = 0; @@ -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; |