diff options
Diffstat (limited to 'src')
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() |