Scripts/Culling of Stratholme: Fixed quest 'Dispelling Illusions'

This commit is contained in:
Shauren
2011-04-30 18:52:29 +02:00
parent c537580b84
commit d23fb7128e
7 changed files with 365 additions and 212 deletions
+16 -1
View File
@@ -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
@@ -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();
}
@@ -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
@@ -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) { }
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
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
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;
}
}
void OnGameObjectCreate(GameObject* go)
{
switch(go->GetEntry())
{
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;
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
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;
_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;
}
if (data == DONE)
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
bool IsEncounterInProgress() const
{
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];
}
return 0;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
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;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "C S " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " "
<< m_auiEncounter[2] << " " << m_auiEncounter[3] << " " << m_auiEncounter[4];
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> 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;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
m_auiEncounter[i] = NOT_STARTED;
if (_encounterState[i] == IN_PROGRESS)
return true;
} else OUT_LOAD_INST_DATA_FAIL;
return false;
}
OUT_LOAD_INST_DATA_COMPLETE;
}
};
void FillInitialWorldStates(WorldPacket& data)
{
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);
}
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;
}
}
void OnGameObjectCreate(GameObject* go)
{
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;
}
}
void SetData(uint32 type, uint32 data)
{
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();
}
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;
}
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;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "C S " << _encounterState[0] << " " << _encounterState[1] << " "
<< _encounterState[2] << " " << _encounterState[3] << " " << _encounterState[4];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3, data4;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4;
if (dataHead1 == 'C' && dataHead2 == 'S')
{
_encounterState[0] = data0;
_encounterState[1] = data1;
_encounterState[2] = data2;
_encounterState[3] = data3;
_encounterState[4] = data4;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (_encounterState[i] == IN_PROGRESS)
_encounterState[i] = NOT_STARTED;
}
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()