aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp5
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp3
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp8
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp9
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp10
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp313
-rw-r--r--src/server/scripts/EasternKingdoms/Scholomance/scholomance.h12
10 files changed, 211 insertions, 175 deletions
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
index 4e2a1b6fa19..b596ad3f609 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_darkmaster_gandling.cpp
@@ -58,20 +58,21 @@ class boss_darkmaster_gandling : public CreatureScript
void Reset()
{
+ _Reset();
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
gate->SetGoState(GO_STATE_ACTIVE);
}
void JustDied(Unit* /*killer*/)
{
- if (instance)
- instance->SetData(DATA_DARKMASTERGANDLING, DONE);
+ _JustDied();
if (GameObject* gate = me->GetMap()->GetGameObject(instance->GetData64(GO_GATE_GANDLING)))
gate->SetGoState(GO_STATE_ACTIVE);
}
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_ARCANEMISSILES, 4500);
events.ScheduleEvent(EVENT_SHADOWSHIELD, 12000);
events.ScheduleEvent(EVENT_CURSE, 2000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
index fc54b90ab45..b2a91f4efe4 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_doctor_theolen_krastinov.cpp
@@ -53,16 +53,9 @@ class boss_doctor_theolen_krastinov : public CreatureScript
{
boss_theolenkrastinovAI(Creature* creature) : BossAI(creature, DATA_DOCTORTHEOLENKRASTINOV) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_DOCTORTHEOLENKRASTINOV, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_REND, 8000);
events.ScheduleEvent(EVENT_BACKHAND, 9000);
events.ScheduleEvent(EVENT_FRENZY, 1000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
index 64d827e41f1..d09a5ae96c9 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_illucia_barov.cpp
@@ -50,16 +50,9 @@ class boss_illucia_barov : public CreatureScript
{
boss_illuciabarovAI(Creature* creature) : BossAI(creature,DATA_LADYILLUCIABAROV) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_LADYILLUCIABAROV, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_CURSEOFAGONY, 18000);
events.ScheduleEvent(EVENT_SHADOWSHOCK, 9000);
events.ScheduleEvent(EVENT_SILENCE, 5000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
index 1f55666acc3..5036158cae2 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_instructor_malicia.cpp
@@ -57,18 +57,14 @@ class boss_instructor_malicia : public CreatureScript
void Reset()
{
+ _Reset();
FlashCounter = 0;
TouchCounter = 0;
}
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_INSTRUCTORMALICIA, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_CALLOFGRAVES, 4000);
events.ScheduleEvent(EVENT_CORRUPTION, 8000);
events.ScheduleEvent(EVENT_RENEW, 32000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
index 9d8f448964c..32c16a1c70c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp
@@ -103,8 +103,7 @@ class boss_kirtonos_the_herald : public CreatureScript
brazier->ResetDoorOrButton();
brazier->SetGoState(GO_STATE_READY);
}
- if (instance)
- instance->SetData(DATA_KIRTONOS, DONE);
+ _JustDied();
}
void EnterEvadeMode()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
index c246e781bd8..e8fb4324d00 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lord_alexei_barov.cpp
@@ -48,17 +48,13 @@ class boss_lord_alexei_barov : public CreatureScript
void Reset()
{
+ _Reset();
me->LoadCreaturesAddon();
}
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_LORDALEXEIBAROV, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_IMMOLATE, 7000);
events.ScheduleEvent(EVENT_VEILOFSHADOW, 15000);
}
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
index 2239194a5e3..d06189d5054 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_lorekeeper_polkelt.cpp
@@ -50,16 +50,9 @@ class boss_lorekeeper_polkelt : public CreatureScript
{
boss_lorekeeperpolkeltAI(Creature* creature) : BossAI(creature, DATA_LOREKEEPERPOLKELT) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_LOREKEEPERPOLKELT, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_VOLATILEINFECTION, 38000);
events.ScheduleEvent(EVENT_DARKPLAGUE, 8000);
events.ScheduleEvent(EVENT_CORROSIVEACID, 45000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
index e2e04ae7b81..99b9fba958c 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_the_ravenian.cpp
@@ -42,7 +42,6 @@ enum Events
EVENT_KNOCKAWAY = 4
};
-
class boss_the_ravenian : public CreatureScript
{
public: boss_the_ravenian() : CreatureScript("boss_the_ravenian") { }
@@ -51,16 +50,9 @@ class boss_the_ravenian : public CreatureScript
{
boss_theravenianAI(Creature* creature) : BossAI(creature, DATA_THERAVENIAN) {}
- void Reset() {}
-
- void JustDied(Unit* /*killer*/)
- {
- if (instance)
- instance->SetData(DATA_THERAVENIAN, DONE);
- }
-
void EnterCombat(Unit* /*who*/)
{
+ _EnterCombat();
events.ScheduleEvent(EVENT_TRAMPLE, 24000);
events.ScheduleEvent(EVENT_CLEAVE, 15000);
events.ScheduleEvent(EVENT_SUNDERINCLEAVE, 40000);
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
index d97372d4379..c43c1e18811 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
+++ b/src/server/scripts/EasternKingdoms/Scholomance/instance_scholomance.cpp
@@ -24,151 +24,222 @@ EndScriptData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
-#include "scholomance.h"
#include "Player.h"
+#include "scholomance.h"
-enum CreatureId
-{
- NPC_DARKMASTER_GANDLING = 1853
-};
-
-Position const GandlingLoc = {180.7712f, -5.428603f, 75.57024f, 1.291544f};
+Position const GandlingLoc = { 180.7712f, -5.428603f, 75.57024f, 1.291544f };
class instance_scholomance : public InstanceMapScript
{
-public:
- instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const
- {
- return new instance_scholomance_InstanceMapScript(map);
- }
-
- struct instance_scholomance_InstanceMapScript : public InstanceScript
- {
- instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map) {}
-
- //Lord Alexei Barov, Doctor Theolen Krastinov, The Ravenian, Lorekeeper Polkelt, Instructor Malicia and the Lady Illucia Barov.
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- uint64 GateKirtonosGUID;
- uint64 GateGandlingGUID;
- uint64 GateMiliciaGUID;
- uint64 GateTheolenGUID;
- uint64 GatePolkeltGUID;
- uint64 GateRavenianGUID;
- uint64 GateBarovGUID;
- uint64 GateIlluciaGUID;
- uint64 BrazierOfTheHeraldGUID;
-
- void Initialize()
+ public:
+ instance_scholomance() : InstanceMapScript("instance_scholomance", 289) { }
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
{
- GateKirtonosGUID = 0;
- GateGandlingGUID = 0;
- GateMiliciaGUID = 0;
- GateTheolenGUID = 0;
- GatePolkeltGUID = 0;
- GateRavenianGUID = 0;
- GateBarovGUID = 0;
- GateIlluciaGUID = 0;
- BrazierOfTheHeraldGUID = 0;
-
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- m_auiEncounter[i] = NOT_STARTED;
+ return new instance_scholomance_InstanceMapScript(map);
}
- void OnGameObjectCreate(GameObject* go)
+ struct instance_scholomance_InstanceMapScript : public InstanceScript
{
- switch (go->GetEntry())
+ instance_scholomance_InstanceMapScript(Map* map) : InstanceScript(map)
{
- case GO_GATE_KIRTONOS: GateKirtonosGUID = go->GetGUID(); break;
- case GO_GATE_GANDLING: GateGandlingGUID = go->GetGUID(); break;
- case GO_GATE_MALICIA: GateMiliciaGUID = go->GetGUID(); break;
- case GO_GATE_THEOLEN: GateTheolenGUID = go->GetGUID(); break;
- case GO_GATE_POLKELT: GatePolkeltGUID = go->GetGUID(); break;
- case GO_GATE_RAVENIAN: GateRavenianGUID = go->GetGUID(); break;
- case GO_GATE_BAROV: GateBarovGUID = go->GetGUID(); break;
- case GO_GATE_ILLUCIA: GateIlluciaGUID = go->GetGUID(); break;
- case GO_BRAZIER_OF_THE_HERALD: BrazierOfTheHeraldGUID = go->GetGUID(); break;
+ SetBossNumber(EncounterCount);
+ GateKirtonosGUID = 0;
+ GateGandlingGUID = 0;
+ GateMiliciaGUID = 0;
+ GateTheolenGUID = 0;
+ GatePolkeltGUID = 0;
+ GateRavenianGUID = 0;
+ GateBarovGUID = 0;
+ GateIlluciaGUID = 0;
+ BrazierOfTheHeraldGUID = 0;
}
- }
- void SetData(uint32 type, uint32 data)
- {
- switch (type)
+ void OnGameObjectCreate(GameObject* go)
{
- case DATA_LORDALEXEIBAROV:
- m_auiEncounter[DATA_LORDALEXEIBAROV] = data;
- CheckToSpawnGandling();
- break;
- case DATA_DOCTORTHEOLENKRASTINOV:
- m_auiEncounter[DATA_DOCTORTHEOLENKRASTINOV] = data;
- CheckToSpawnGandling();
- break;
- case DATA_THERAVENIAN:
- m_auiEncounter[DATA_THERAVENIAN] = data;
- CheckToSpawnGandling();
- break;
- case DATA_LOREKEEPERPOLKELT:
- m_auiEncounter[DATA_LOREKEEPERPOLKELT] = data;
- CheckToSpawnGandling();
- break;
- case DATA_INSTRUCTORMALICIA:
- m_auiEncounter[DATA_INSTRUCTORMALICIA] = data;
- CheckToSpawnGandling();
- break;
- case DATA_LADYILLUCIABAROV:
- m_auiEncounter[DATA_LADYILLUCIABAROV] = data;
- CheckToSpawnGandling();
- break;
- case DATA_DARKMASTERGANDLING:
- m_auiEncounter[DATA_DARKMASTERGANDLING] = data;
- break;
- case DATA_KIRTONOS:
- m_auiEncounter[DATA_KIRTONOS] = data;
- break;
+ switch (go->GetEntry())
+ {
+ case GO_GATE_KIRTONOS:
+ GateKirtonosGUID = go->GetGUID();
+ break;
+ case GO_GATE_GANDLING:
+ GateGandlingGUID = go->GetGUID();
+ break;
+ case GO_GATE_MALICIA:
+ GateMiliciaGUID = go->GetGUID();
+ break;
+ case GO_GATE_THEOLEN:
+ GateTheolenGUID = go->GetGUID();
+ break;
+ case GO_GATE_POLKELT:
+ GatePolkeltGUID = go->GetGUID();
+ break;
+ case GO_GATE_RAVENIAN:
+ GateRavenianGUID = go->GetGUID();
+ break;
+ case GO_GATE_BAROV:
+ GateBarovGUID = go->GetGUID();
+ break;
+ case GO_GATE_ILLUCIA:
+ GateIlluciaGUID = go->GetGUID();
+ break;
+ case GO_BRAZIER_OF_THE_HERALD:
+ BrazierOfTheHeraldGUID = go->GetGUID();
+ break;
+ default:
+ break;
+ }
}
- }
- uint32 GetData(uint32 type) const
- {
- return type == (m_auiEncounter[DATA_LORDALEXEIBAROV] == DONE) && (m_auiEncounter[DATA_DOCTORTHEOLENKRASTINOV] == DONE) &&
- (m_auiEncounter[DATA_THERAVENIAN] == DONE) && (m_auiEncounter[DATA_LOREKEEPERPOLKELT] == DONE) &&
- (m_auiEncounter[DATA_INSTRUCTORMALICIA] == DONE) && (m_auiEncounter[DATA_LADYILLUCIABAROV] == DONE)
- ? IN_PROGRESS : 0;
- }
+ bool SetBossState(uint32 type, EncounterState state)
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_LORDALEXEIBAROV:
+ case DATA_DOCTORTHEOLENKRASTINOV:
+ case DATA_THERAVENIAN:
+ case DATA_LOREKEEPERPOLKELT:
+ case DATA_INSTRUCTORMALICIA:
+ case DATA_LADYILLUCIABAROV:
+ CheckToSpawnGandling();
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
- uint64 GetData64(uint32 type) const
- {
- switch (type)
+ uint64 GetData64(uint32 type) const
{
- case GO_GATE_KIRTONOS: return GateKirtonosGUID; break;
- case GO_GATE_GANDLING: return GateGandlingGUID; break;
- case GO_GATE_MALICIA: return GateMiliciaGUID; break;
- case GO_GATE_THEOLEN: return GateTheolenGUID; break;
- case GO_GATE_POLKELT: return GatePolkeltGUID; break;
- case GO_GATE_RAVENIAN: return GateRavenianGUID; break;
- case GO_GATE_BAROV: return GateBarovGUID; break;
- case GO_GATE_ILLUCIA: return GateIlluciaGUID; break;
- case GO_BRAZIER_OF_THE_HERALD: return BrazierOfTheHeraldGUID; break;
+ switch (type)
+ {
+ case GO_GATE_KIRTONOS:
+ return GateKirtonosGUID;
+ break;
+ case GO_GATE_GANDLING:
+ return GateGandlingGUID;
+ break;
+ case GO_GATE_MALICIA:
+ return GateMiliciaGUID;
+ break;
+ case GO_GATE_THEOLEN:
+ return GateTheolenGUID;
+ break;
+ case GO_GATE_POLKELT:
+ return GatePolkeltGUID;
+ break;
+ case GO_GATE_RAVENIAN:
+ return GateRavenianGUID;
+ break;
+ case GO_GATE_BAROV:
+ return GateBarovGUID;
+ break;
+ case GO_GATE_ILLUCIA:
+ return GateIlluciaGUID;
+ break;
+ case GO_BRAZIER_OF_THE_HERALD:
+ return BrazierOfTheHeraldGUID;
+ break;
+ default:
+ break;
+ }
+
+ return 0;
}
- return 0;
- }
+ bool CheckPreBosses(uint32 bossId) const
+ {
+ switch (bossId)
+ {
+ case DATA_DARKMASTERGANDLING:
+ if (GetBossState(DATA_LORDALEXEIBAROV) != DONE)
+ return false;
+ if (GetBossState(DATA_DOCTORTHEOLENKRASTINOV) != DONE)
+ return false;
+ if (GetBossState(DATA_THERAVENIAN) != DONE)
+ return false;
+ if (GetBossState(DATA_LOREKEEPERPOLKELT) != DONE)
+ return false;
+ if (GetBossState(DATA_INSTRUCTORMALICIA) != DONE)
+ return false;
+ if (GetBossState(DATA_LADYILLUCIABAROV) != DONE)
+ return false;
+ if (GetBossState(DATA_DARKMASTERGANDLING) == DONE)
+ return false;
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
- void CheckToSpawnGandling()
- {
- if (GetData(DATA_DARKMASTERGANDLING) == IN_PROGRESS)
+ void CheckToSpawnGandling()
+ {
+ if (CheckPreBosses(DATA_DARKMASTERGANDLING))
+ instance->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);
+ }
+
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "S O " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(const char* str)
{
- Map::PlayerList const &PlayerList = instance->GetPlayers();
- if (PlayerList.isEmpty())
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
- Map::PlayerList::const_iterator i = PlayerList.begin();
- if (Player* i_pl = i->getSource())
- i_pl->SummonCreature(NPC_DARKMASTER_GANDLING, GandlingLoc);
+ if (dataHead1 == 'S' && dataHead2 == 'O')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+
+ CheckToSpawnGandling();
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
}
- }
- };
+
+ protected:
+ uint64 GateKirtonosGUID;
+ uint64 GateGandlingGUID;
+ uint64 GateMiliciaGUID;
+ uint64 GateTheolenGUID;
+ uint64 GatePolkeltGUID;
+ uint64 GateRavenianGUID;
+ uint64 GateBarovGUID;
+ uint64 GateIlluciaGUID;
+ uint64 BrazierOfTheHeraldGUID;
+ };
};
void AddSC_instance_scholomance()
diff --git a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
index 2d9c8c7bbe7..5c38cc39e3d 100644
--- a/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
+++ b/src/server/scripts/EasternKingdoms/Scholomance/scholomance.h
@@ -18,6 +18,8 @@
#ifndef DEF_SCHOLOMANCE_H
#define DEF_SCHOLOMANCE_H
+uint32 const EncounterCount = 8;
+
enum DataTypes
{
DATA_DOCTORTHEOLENKRASTINOV = 0,
@@ -30,6 +32,11 @@ enum DataTypes
DATA_KIRTONOS = 7
};
+enum CreatureIds
+{
+ NPC_DARKMASTER_GANDLING = 1853
+};
+
enum GameobjectIds
{
GO_GATE_KIRTONOS = 175570,
@@ -43,9 +50,4 @@ enum GameobjectIds
GO_BRAZIER_OF_THE_HERALD = 175564
};
-enum Misc
-{
- MAX_ENCOUNTER = 8
-};
-
#endif