aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp17
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp41
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h50
-rw-r--r--src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp418
4 files changed, 334 insertions, 192 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 4233ba7d677..0df1476187d 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -9021,9 +9021,11 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
case 4710:
NumberOfFields = 28;
break;
- case 4812:
+ case 4812: // Icecrown Citadel
NumberOfFields = 13;
break;
+ case 4100: // The Culling of Stratholme
+ NumberOfFields = 13;
default:
NumberOfFields = 12;
break;
@@ -9555,6 +9557,19 @@ void Player::SendInitWorldStates(uint32 zoneid, uint32 areaid)
data << uint32(4942) << uint32(50); // 13 WORLDSTATE_ATTEMPTS_MAX
}
break;
+ // The Culling of Stratholme
+ case 4100:
+ if (instance && mapid == 595)
+ instance->FillInitialWorldStates(data);
+ else
+ {
+ data << uint32(3479) << uint32(0); // 9 WORLDSTATE_SHOW_CRATES
+ data << uint32(3480) << uint32(0); // 10 WORLDSTATE_CRATES_REVEALED
+ data << uint32(3504) << uint32(0); // 11 WORLDSTATE_WAVE_COUNT
+ data << uint32(3931) << uint32(25); // 12 WORLDSTATE_TIME_GUARDIAN
+ data << uint32(3932) << uint32(0); // 13 WORLDSTATE_TIME_GUARDIAN_SHOW
+ }
+ break;
default:
data << uint32(0x914) << uint32(0x0); // 7
data << uint32(0x913) << uint32(0x0); // 8
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
index 3e86a796480..91028e8745a 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.cpp
@@ -114,6 +114,7 @@ enum Spells
SPELL_EXORCISM_N = 52445,
SPELL_EXORCISM_H = 58822,
SPELL_HOLY_LIGHT = 52444,
+ SPELL_ARCANE_DISRUPTION = 49590,
};
enum GossipMenuArthas
@@ -125,7 +126,7 @@ enum GossipMenuArthas
GOSSIP_MENU_ARTHAS_5 = 100005
};
-enum
+enum EncounterData
{
ENCOUNTER_WAVES_NUMBER = 8,
ENCOUNTER_WAVES_MAX_SPAWNS = 5,
@@ -1202,7 +1203,45 @@ public:
};
+class npc_crate_helper : public CreatureScript
+{
+ public:
+ npc_crate_helper() : CreatureScript("npc_create_helper_cot") { }
+
+ struct npc_crate_helperAI : public NullCreatureAI
+ {
+ npc_crate_helperAI(Creature* creature) : NullCreatureAI(creature)
+ {
+ _marked = false;
+ }
+
+ void SpellHit(Unit* caster, SpellEntry const* spell)
+ {
+ if (spell->Id == SPELL_ARCANE_DISRUPTION && !_marked)
+ {
+ _marked = true;
+ if (InstanceScript* instance = me->GetInstanceScript())
+ instance->SetData(DATA_CRATE_COUNT, instance->GetData(DATA_CRATE_COUNT) + 1);
+ if (GameObject* crate = me->FindNearestGameObject(GO_SUSPICIOUS_CRATE, 5.0f))
+ {
+ crate->SummonGameObject(GO_PLAGUED_CRATE, crate->GetPositionX(), crate->GetPositionY(), crate->GetPositionZ(), crate->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, DAY);
+ crate->Delete();
+ }
+ }
+ }
+
+ private:
+ bool _marked;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_crate_helperAI(creature);
+ }
+};
+
void AddSC_culling_of_stratholme()
{
new npc_arthas();
+ new npc_crate_helper();
}
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
index 141969d9ece..ed0f237d600 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/culling_of_stratholme.h
@@ -25,7 +25,8 @@ enum Data
DATA_EPOCH_EVENT,
DATA_MAL_GANIS_EVENT,
DATA_INFINITE_EVENT,
- DATA_ARTHAS_EVENT
+ DATA_ARTHAS_EVENT,
+ DATA_CRATE_COUNT,
};
enum Data64
@@ -45,23 +46,42 @@ enum Data64
enum Creatures
{
- NPC_MEATHOOK = 26529,
- NPC_SALRAMM = 26530,
- NPC_EPOCH = 26532,
- NPC_MAL_GANIS = 26533,
- NPC_INFINITE = 32273,
- NPC_ARTHAS = 26499,
- NPC_JAINA = 26497,
- NPC_UTHER = 26528
+ NPC_MEATHOOK = 26529,
+ NPC_SALRAMM = 26530,
+ NPC_EPOCH = 26532,
+ NPC_MAL_GANIS = 26533,
+ NPC_INFINITE = 32273,
+ NPC_ARTHAS = 26499,
+ NPC_JAINA = 26497,
+ NPC_UTHER = 26528,
+ NPC_CHROMIE_2 = 27915,
+ NPC_GENERIC_BUNNY = 28960,
};
enum GameObjects
{
- GO_SHKAF_GATE = 188686,
- GO_MALGANIS_GATE_1 = 187711,
- GO_MALGANIS_GATE_2 = 187723,
- GO_EXIT_GATE = 191788,
- GO_MALGANIS_CHEST_N = 190663,
- GO_MALGANIS_CHEST_H = 193597
+ GO_SHKAF_GATE = 188686,
+ GO_MALGANIS_GATE_1 = 187711,
+ GO_MALGANIS_GATE_2 = 187723,
+ GO_EXIT_GATE = 191788,
+ GO_MALGANIS_CHEST_N = 190663,
+ GO_MALGANIS_CHEST_H = 193597,
+ GO_SUSPICIOUS_CRATE = 190094,
+ GO_PLAGUED_CRATE = 190095,
};
+
+enum WorldStatesCoT
+{
+ WORLDSTATE_SHOW_CRATES = 3479,
+ WORLDSTATE_CRATES_REVEALED = 3480,
+ WORLDSTATE_WAVE_COUNT = 3504,
+ WORLDSTATE_TIME_GUARDIAN = 3931,
+ WORLDSTATE_TIME_GUARDIAN_SHOW = 3932,
+};
+
+enum CrateSpells
+{
+ SPELL_CRATES_CREDIT = 58109,
+};
+
#endif
diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
index 2e600b950ca..4b97520e768 100644
--- a/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
+++ b/src/server/scripts/Kalimdor/CavernsOfTime/CullingOfStratholme/instance_culling_of_stratholme.cpp
@@ -28,216 +28,284 @@
4 - Infinite Corruptor (Heroic only)
*/
+enum Texts
+{
+ SAY_CRATES_COMPLETED = 0,
+};
+
+Position const ChromieSummonPos = {1813.298f, 1283.578f, 142.3258f, 3.878161f};
+
class instance_culling_of_stratholme : public InstanceMapScript
{
-public:
- instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* pMap) const
- {
- return new instance_culling_of_stratholme_InstanceMapScript(pMap);
- }
-
- struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript
- {
- instance_culling_of_stratholme_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {}
-
- uint64 uiArthas;
- uint64 uiMeathook;
- uint64 uiSalramm;
- uint64 uiEpoch;
- uint64 uiMalGanis;
- uint64 uiInfinite;
-
- uint64 uiShkafGate;
- uint64 uiMalGanisGate1;
- uint64 uiMalGanisGate2;
- uint64 uiExitGate;
- uint64 uiMalGanisChest;
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
- std::string str_data;
-
- bool IsEncounterInProgress() const
- {
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS) return true;
+ public:
+ instance_culling_of_stratholme() : InstanceMapScript("instance_culling_of_stratholme", 595) { }
- return false;
+ InstanceScript* GetInstanceScript(InstanceMap* pMap) const
+ {
+ return new instance_culling_of_stratholme_InstanceMapScript(pMap);
}
- void OnCreatureCreate(Creature* creature)
+ struct instance_culling_of_stratholme_InstanceMapScript : public InstanceScript
{
- switch(creature->GetEntry())
+ instance_culling_of_stratholme_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
{
- case NPC_ARTHAS:
- uiArthas = creature->GetGUID();
- break;
- case NPC_MEATHOOK:
- uiMeathook = creature->GetGUID();
- break;
- case NPC_SALRAMM:
- uiSalramm = creature->GetGUID();
- break;
- case NPC_EPOCH:
- uiEpoch = creature->GetGUID();
- break;
- case NPC_MAL_GANIS:
- uiMalGanis = creature->GetGUID();
- break;
- case NPC_INFINITE:
- uiInfinite = creature->GetGUID();
- break;
+ _arthasGUID = 0;
+ _meathookGUID = 0;
+ _salrammGUID = 0;
+ _epochGUID = 0;
+ _malGanisGUID = 0;
+ _infiniteGUID = 0;
+ _shkafGateGUID = 0;
+ _malGanisGate1GUID = 0;
+ _malGanisGate2GUID = 0;
+ _exitGateGUID = 0;
+ _malGanisChestGUID = 0;
+ _genericBunnyGUID = 0;
+ memset(&_encounterState[0], 0, sizeof(uint32) * MAX_ENCOUNTER);
+ _crateCount = 0;
}
- }
- void OnGameObjectCreate(GameObject* go)
- {
- switch(go->GetEntry())
+ bool IsEncounterInProgress() const
{
- case GO_SHKAF_GATE:
- uiShkafGate = go->GetGUID();
- break;
- case GO_MALGANIS_GATE_1:
- uiMalGanisGate1 = go->GetGUID();
- break;
- case GO_MALGANIS_GATE_2:
- uiMalGanisGate2 = go->GetGUID();
- break;
- case GO_EXIT_GATE:
- uiExitGate = go->GetGUID();
- if (m_auiEncounter[3] == DONE)
- HandleGameObject(uiExitGate, true);
- break;
- case GO_MALGANIS_CHEST_N:
- case GO_MALGANIS_CHEST_H:
- uiMalGanisChest = go->GetGUID();
- if (m_auiEncounter[3] == DONE)
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (_encounterState[i] == IN_PROGRESS)
+ return true;
+
+ return false;
}
- }
- void SetData(uint32 type, uint32 data)
- {
- switch(type)
+ void FillInitialWorldStates(WorldPacket& data)
{
- case DATA_MEATHOOK_EVENT:
- m_auiEncounter[0] = data;
- break;
- case DATA_SALRAMM_EVENT:
- m_auiEncounter[1] = data;
- break;
- case DATA_EPOCH_EVENT:
- m_auiEncounter[2] = data;
- break;
- case DATA_MAL_GANIS_EVENT:
- m_auiEncounter[3] = data;
-
- switch(m_auiEncounter[3])
- {
- case NOT_STARTED:
- HandleGameObject(uiMalGanisGate2, true);
- break;
- case IN_PROGRESS:
- HandleGameObject(uiMalGanisGate2, false);
- break;
- case DONE:
- HandleGameObject(uiExitGate, true);
- if (GameObject* go = instance->GetGameObject(uiMalGanisChest))
- go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
- break;
- }
- break;
- case DATA_INFINITE_EVENT:
- m_auiEncounter[4] = data;
- break;
+ data << uint32(WORLDSTATE_SHOW_CRATES) << uint32(1);
+ data << uint32(WORLDSTATE_CRATES_REVEALED) << uint32(_crateCount);
+ data << uint32(WORLDSTATE_WAVE_COUNT) << uint32(0);
+ data << uint32(WORLDSTATE_TIME_GUARDIAN) << uint32(25);
+ data << uint32(WORLDSTATE_TIME_GUARDIAN_SHOW) << uint32(0);
}
- if (data == DONE)
- SaveToDB();
- }
+ void OnCreatureCreate(Creature* creature)
+ {
+ switch (creature->GetEntry())
+ {
+ case NPC_ARTHAS:
+ _arthasGUID = creature->GetGUID();
+ break;
+ case NPC_MEATHOOK:
+ _meathookGUID = creature->GetGUID();
+ break;
+ case NPC_SALRAMM:
+ _salrammGUID = creature->GetGUID();
+ break;
+ case NPC_EPOCH:
+ _epochGUID = creature->GetGUID();
+ break;
+ case NPC_MAL_GANIS:
+ _malGanisGUID = creature->GetGUID();
+ break;
+ case NPC_INFINITE:
+ _infiniteGUID = creature->GetGUID();
+ break;
+ case NPC_GENERIC_BUNNY:
+ _genericBunnyGUID = creature->GetGUID();
+ break;
+ }
+ }
- uint32 GetData(uint32 type)
- {
- switch(type)
+ void OnGameObjectCreate(GameObject* go)
{
- case DATA_MEATHOOK_EVENT: return m_auiEncounter[0];
- case DATA_SALRAMM_EVENT: return m_auiEncounter[1];
- case DATA_EPOCH_EVENT: return m_auiEncounter[2];
- case DATA_MAL_GANIS_EVENT: return m_auiEncounter[3];
- case DATA_INFINITE_EVENT: return m_auiEncounter[4];
+ switch (go->GetEntry())
+ {
+ case GO_SHKAF_GATE:
+ _shkafGateGUID = go->GetGUID();
+ break;
+ case GO_MALGANIS_GATE_1:
+ _malGanisGate1GUID = go->GetGUID();
+ break;
+ case GO_MALGANIS_GATE_2:
+ _malGanisGate2GUID = go->GetGUID();
+ break;
+ case GO_EXIT_GATE:
+ _exitGateGUID = go->GetGUID();
+ if (_encounterState[3] == DONE)
+ HandleGameObject(_exitGateGUID, true);
+ break;
+ case GO_MALGANIS_CHEST_N:
+ case GO_MALGANIS_CHEST_H:
+ _malGanisChestGUID = go->GetGUID();
+ if (_encounterState[3] == DONE)
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
+ }
}
- return 0;
- }
- uint64 GetData64(uint32 identifier)
- {
- switch(identifier)
+ void SetData(uint32 type, uint32 data)
{
- case DATA_ARTHAS: return uiArthas;
- case DATA_MEATHOOK: return uiMeathook;
- case DATA_SALRAMM: return uiSalramm;
- case DATA_EPOCH: return uiEpoch;
- case DATA_MAL_GANIS: return uiMalGanis;
- case DATA_INFINITE: return uiInfinite;
- case DATA_SHKAF_GATE: return uiShkafGate;
- case DATA_MAL_GANIS_GATE_1: return uiMalGanisGate1;
- case DATA_MAL_GANIS_GATE_2: return uiMalGanisGate2;
- case DATA_EXIT_GATE: return uiExitGate;
- case DATA_MAL_GANIS_CHEST: return uiMalGanisChest;
+ switch (type)
+ {
+ case DATA_MEATHOOK_EVENT:
+ _encounterState[0] = data;
+ break;
+ case DATA_SALRAMM_EVENT:
+ _encounterState[1] = data;
+ break;
+ case DATA_EPOCH_EVENT:
+ _encounterState[2] = data;
+ break;
+ case DATA_MAL_GANIS_EVENT:
+ _encounterState[3] = data;
+
+ switch (_encounterState[3])
+ {
+ case NOT_STARTED:
+ HandleGameObject(_malGanisGate2GUID, true);
+ break;
+ case IN_PROGRESS:
+ HandleGameObject(_malGanisGate2GUID, false);
+ break;
+ case DONE:
+ HandleGameObject(_exitGateGUID, true);
+ if (GameObject* go = instance->GetGameObject(_malGanisChestGUID))
+ go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND);
+ break;
+ }
+ break;
+ case DATA_INFINITE_EVENT:
+ _encounterState[4] = data;
+ break;
+ case DATA_CRATE_COUNT:
+ _crateCount = data;
+ if (_crateCount == 5)
+ {
+ if (Creature* bunny = instance->GetCreature(_genericBunnyGUID))
+ bunny->CastSpell(bunny, SPELL_CRATES_CREDIT, true);
+
+ // Summon Chromie and global whisper
+ if (Creature* chromie = instance->SummonCreature(NPC_CHROMIE_2, ChromieSummonPos))
+ if (!instance->GetPlayers().isEmpty())
+ if (Player* plr = instance->GetPlayers().getFirst()->getSource())
+ sCreatureTextMgr->SendChat(chromie, SAY_CRATES_COMPLETED, plr->GetGUID(), CHAT_TYPE_END, LANG_ADDON, TEXT_RANGE_MAP);
+ }
+ DoUpdateWorldState(WORLDSTATE_CRATES_REVEALED, _crateCount);
+ break;
+ }
+
+ if (data == DONE)
+ SaveToDB();
}
- return 0;
- }
- std::string GetSaveData()
- {
- OUT_SAVE_INST_DATA;
+ uint32 GetData(uint32 type)
+ {
+ switch (type)
+ {
+ case DATA_MEATHOOK_EVENT:
+ return _encounterState[0];
+ case DATA_SALRAMM_EVENT:
+ return _encounterState[1];
+ case DATA_EPOCH_EVENT:
+ return _encounterState[2];
+ case DATA_MAL_GANIS_EVENT:
+ return _encounterState[3];
+ case DATA_INFINITE_EVENT:
+ return _encounterState[4];
+ case DATA_CRATE_COUNT:
+ return _crateCount;
+ }
+ return 0;
+ }
- std::ostringstream saveStream;
- saveStream << "C S " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
- << m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4];
+ uint64 GetData64(uint32 identifier)
+ {
+ switch (identifier)
+ {
+ case DATA_ARTHAS:
+ return _arthasGUID;
+ case DATA_MEATHOOK:
+ return _meathookGUID;
+ case DATA_SALRAMM:
+ return _salrammGUID;
+ case DATA_EPOCH:
+ return _epochGUID;
+ case DATA_MAL_GANIS:
+ return _malGanisGUID;
+ case DATA_INFINITE:
+ return _infiniteGUID;
+ case DATA_SHKAF_GATE:
+ return _shkafGateGUID;
+ case DATA_MAL_GANIS_GATE_1:
+ return _malGanisGate1GUID;
+ case DATA_MAL_GANIS_GATE_2:
+ return _malGanisGate2GUID;
+ case DATA_EXIT_GATE:
+ return _exitGateGUID;
+ case DATA_MAL_GANIS_CHEST:
+ return _malGanisChestGUID;
+ }
+ return 0;
+ }
- str_data = saveStream.str();
+ std::string GetSaveData()
+ {
+ OUT_SAVE_INST_DATA;
- OUT_SAVE_INST_DATA_COMPLETE;
- return str_data;
- }
+ std::ostringstream saveStream;
+ saveStream << "C S " << _encounterState[0] << " " << _encounterState[1] << " "
+ << _encounterState[2] << " " << _encounterState[3] << " " << _encounterState[4];
- void Load(const char* in)
- {
- if (!in)
- {
- OUT_LOAD_INST_DATA_FAIL;
- return;
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
}
- OUT_LOAD_INST_DATA(in);
+ void Load(const char* in)
+ {
+ if (!in)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
- char dataHead1, dataHead2;
- uint16 data0, data1, data2, data3, data4;
+ OUT_LOAD_INST_DATA(in);
- std::istringstream loadStream(in);
- loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
+ char dataHead1, dataHead2;
+ uint16 data0, data1, data2, data3, data4;
- if (dataHead1 == 'C' && dataHead2 == 'S')
- {
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
- m_auiEncounter[4] = data4;
+ std::istringstream loadStream(in);
+ loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ if (dataHead1 == 'C' && dataHead2 == 'S')
+ {
+ _encounterState[0] = data0;
+ _encounterState[1] = data1;
+ _encounterState[2] = data2;
+ _encounterState[3] = data3;
+ _encounterState[4] = data4;
- } else OUT_LOAD_INST_DATA_FAIL;
+ for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ if (_encounterState[i] == IN_PROGRESS)
+ _encounterState[i] = NOT_STARTED;
- OUT_LOAD_INST_DATA_COMPLETE;
- }
- };
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+ private:
+ uint64 _arthasGUID;
+ uint64 _meathookGUID;
+ uint64 _salrammGUID;
+ uint64 _epochGUID;
+ uint64 _malGanisGUID;
+ uint64 _infiniteGUID;
+ uint64 _shkafGateGUID;
+ uint64 _malGanisGate1GUID;
+ uint64 _malGanisGate2GUID;
+ uint64 _exitGateGUID;
+ uint64 _malGanisChestGUID;
+ uint64 _genericBunnyGUID;
+ uint32 _encounterState[MAX_ENCOUNTER];
+ uint32 _crateCount;
+ };
};
void AddSC_instance_culling_of_stratholme()