Scripts/Serpentshrine Cavern: Fixed "The Lurker Above" achievement and removed hacks for the event

--HG--
branch : trunk
This commit is contained in:
Shauren
2010-12-26 16:35:29 +01:00
parent 821c0f6c42
commit 79070ca820
6 changed files with 436 additions and 355 deletions
@@ -1040,6 +1040,14 @@ void GameObject::Use(Unit* user)
uint32 spellId = 0; uint32 spellId = 0;
bool triggered = false; bool triggered = false;
if (Player* playerUser = user->ToPlayer())
{
if (sScriptMgr->OnGossipHello(playerUser, this))
return;
AI()->GossipHello(playerUser);
}
switch(GetGoType()) switch(GetGoType())
{ {
case GAMEOBJECT_TYPE_DOOR: //0 case GAMEOBJECT_TYPE_DOOR: //0
@@ -1238,15 +1246,14 @@ void GameObject::Use(Unit* user)
//fishing bobber //fishing bobber
case GAMEOBJECT_TYPE_FISHINGNODE: //17 case GAMEOBJECT_TYPE_FISHINGNODE: //17
{ {
if (user->GetTypeId() != TYPEID_PLAYER) Player* player = user->ToPlayer();
if (!player)
return; return;
Player* player = (Player*)user;
if (player->GetGUID() != GetOwnerGUID()) if (player->GetGUID() != GetOwnerGUID())
return; return;
switch(getLootState()) switch (getLootState())
{ {
case GO_READY: // ready for loot case GO_READY: // ready for loot
{ {
@@ -294,11 +294,6 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPacket & recv_data)
if (!obj) if (!obj)
return; return;
if (sScriptMgr->OnGossipHello(_player, obj))
return;
obj->AI()->GossipHello(_player);
obj->Use(_player); obj->Use(_player);
} }
+8 -5
View File
@@ -2631,12 +2631,19 @@ void Spell::EffectEnergizePct(SpellEffIndex effIndex)
void Spell::SendLoot(uint64 guid, LootType loottype) void Spell::SendLoot(uint64 guid, LootType loottype)
{ {
Player* player = (Player*)m_caster; Player* player = m_caster->ToPlayer();
if (!player) if (!player)
return; return;
if (gameObjTarget) if (gameObjTarget)
{ {
// special case, already has GossipHello inside so return and avoid calling twice
if (gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_GOOBER)
{
gameObjTarget->Use(m_caster);
return;
}
if (sScriptMgr->OnGossipHello(player, gameObjTarget)) if (sScriptMgr->OnGossipHello(player, gameObjTarget))
return; return;
@@ -2662,10 +2669,6 @@ void Spell::SendLoot(uint64 guid, LootType loottype)
gameObjTarget->TriggeringLinkedGameObject(trapEntry,m_caster); gameObjTarget->TriggeringLinkedGameObject(trapEntry,m_caster);
return; return;
case GAMEOBJECT_TYPE_GOOBER:
gameObjTarget->Use(m_caster);
return;
case GAMEOBJECT_TYPE_CHEST: case GAMEOBJECT_TYPE_CHEST:
// TODO: possible must be moved to loot release (in different from linked triggering) // TODO: possible must be moved to loot release (in different from linked triggering)
if (gameObjTarget->GetGOInfo()->chest.eventId) if (gameObjTarget->GetGOInfo()->chest.eventId)
@@ -149,7 +149,10 @@ public:
void JustDied(Unit* /*Killer*/) void JustDied(Unit* /*Killer*/)
{ {
if (pInstance) if (pInstance)
{
pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE); pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE);
pInstance->SetData(DATA_STRANGE_POOL, IN_PROGRESS);
}
Summons.DespawnAll(); Summons.DespawnAll();
} }
@@ -193,22 +196,27 @@ public:
Submerged = false; Submerged = false;
WaitTimer2 = 500; WaitTimer2 = 500;
} }
if (!Submerged && WaitTimer2 <= diff)//wait 500ms before emerge anim if (!Submerged && WaitTimer2 <= diff)//wait 500ms before emerge anim
{ {
me->RemoveAllAuras(); me->RemoveAllAuras();
me->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
DoCast(me, SPELL_EMERGE, false); DoCast(me, SPELL_EMERGE, false);
WaitTimer2 = 60000;//never reached WaitTimer2 = 60000;//never reached
WaitTimer = 3000; WaitTimer = 3000;
} else WaitTimer2 -= diff; }
else
WaitTimer2 -= diff;
if (WaitTimer <= diff)//wait 3secs for emerge anim, then attack if (WaitTimer <= diff)//wait 3secs for emerge anim, then attack
{ {
WaitTimer = 3000; WaitTimer = 3000;
CanStartEvent=true;//fresh fished from pool CanStartEvent = true;//fresh fished from pool
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
} else WaitTimer -= diff; }
else
WaitTimer -= diff;
} }
return; return;
} }
@@ -458,9 +466,33 @@ public:
}; };
class go_strange_pool : public GameObjectScript
{
public:
go_strange_pool() : GameObjectScript("go_strange_pool") {}
bool OnGossipHello(Player* player, GameObject* go)
{
// 25%
if (InstanceScript* instanceScript = go->GetInstanceScript())
if (!urand(0, 3))
{
if (instanceScript->GetData(DATA_STRANGE_POOL) == NOT_STARTED)
{
go->CastSpell(player, 54587);
instanceScript->SetData(DATA_STRANGE_POOL, IN_PROGRESS);
}
return true;
}
return false;
}
};
void AddSC_boss_the_lurker_below() void AddSC_boss_the_lurker_below()
{ {
new boss_the_lurker_below(); new boss_the_lurker_below();
new mob_coilfang_guardian(); new mob_coilfang_guardian();
new mob_coilfang_ambusher(); new mob_coilfang_ambusher();
new go_strange_pool();
} }
@@ -49,352 +49,396 @@ EndScriptData */
class go_bridge_console : public GameObjectScript class go_bridge_console : public GameObjectScript
{ {
public: public:
go_bridge_console() : GameObjectScript("go_bridge_console") { } go_bridge_console() : GameObjectScript("go_bridge_console") { }
bool OnGossipHello(Player* /*pPlayer*/, GameObject* go) bool OnGossipHello(Player* /*pPlayer*/, GameObject* go)
{ {
InstanceScript* pInstance = go->GetInstanceScript(); InstanceScript* pInstance = go->GetInstanceScript();
if (!pInstance) if (!pInstance)
return false; return false;
if (pInstance) if (pInstance)
pInstance->SetData(DATA_CONTROL_CONSOLE, DONE); pInstance->SetData(DATA_CONTROL_CONSOLE, DONE);
return true;
}
return true;
}
}; };
class instance_serpent_shrine : public InstanceMapScript class instance_serpent_shrine : public InstanceMapScript
{ {
public: public:
instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { } instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript
{
return new instance_serpentshrine_cavern_InstanceMapScript(pMap);
}
struct instance_serpentshrine_cavern_InstanceMapScript : public InstanceScript
{
instance_serpentshrine_cavern_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
uint64 LurkerBelow;
uint64 Sharkkis;
uint64 Tidalvess;
uint64 Caribdis;
uint64 LadyVashj;
uint64 Karathress;
uint64 KarathressEvent_Starter;
uint64 LeotherasTheBlind;
uint64 LeotherasEventStarter;
uint64 ControlConsole;
uint64 BridgePart[3];
uint32 StrangePool;
uint32 FishingTimer;
uint32 LurkerSubEvent;
uint32 WaterCheckTimer;
uint32 FrenzySpawnTimer;
uint32 Water;
uint32 TrashCount;
bool ShieldGeneratorDeactivated[4];
uint32 m_auiEncounter[MAX_ENCOUNTER];
bool DoSpawnFrenzy;
void Initialize()
{ {
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); instance_serpentshrine_cavern_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
LurkerBelow = 0;
Sharkkis = 0;
Tidalvess = 0;
Caribdis = 0;
LadyVashj = 0;
Karathress = 0;
KarathressEvent_Starter = 0;
LeotherasTheBlind = 0;
LeotherasEventStarter = 0;
ControlConsole = 0;
BridgePart[0] = 0;
BridgePart[1] = 0;
BridgePart[2] = 0;
StrangePool = 0;
Water = WATERSTATE_FRENZY;
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
FishingTimer = 1000;
LurkerSubEvent = 0;
WaterCheckTimer = 500;
FrenzySpawnTimer = 2000;
DoSpawnFrenzy = false;
TrashCount = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void Update (uint32 diff)
{
//Lurker Fishing event
if (LurkerSubEvent == LURKER_FISHING)
{ {
if (FishingTimer <= diff) Initialize();
{
LurkerSubEvent = LURKER_HOOKED;
SetData(DATA_STRANGE_POOL, IN_PROGRESS);//just fished, signal Lurker script to emerge and start fight, we use IN_PROGRESS so it won't get saved and lurker will be alway invis at start if server restarted
} else FishingTimer -= diff;
} }
//Water checks
if (WaterCheckTimer <= diff) void Initialize()
{ {
if (TrashCount >= MIN_KILLS) memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
Water = WATERSTATE_SCALDING;
else
Water = WATERSTATE_FRENZY;
Map::PlayerList const &PlayerList = instance->GetPlayers(); LurkerBelow = 0;
if (PlayerList.isEmpty()) Sharkkis = 0;
return; Tidalvess = 0;
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) Caribdis = 0;
LadyVashj = 0;
Karathress = 0;
KarathressEvent_Starter = 0;
LeotherasTheBlind = 0;
LeotherasEventStarter = 0;
ControlConsole = 0;
BridgePart[0] = 0;
BridgePart[1] = 0;
BridgePart[2] = 0;
StrangePool = 0;
Water = WATERSTATE_FRENZY;
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
FishingTimer = 1000;
WaterCheckTimer = 500;
FrenzySpawnTimer = 2000;
DoSpawnFrenzy = false;
TrashCount = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
void Update(uint32 diff)
{
//Water checks
if (WaterCheckTimer <= diff)
{ {
if (Player* pPlayer = i->getSource()) if (TrashCount >= MIN_KILLS)
{ Water = WATERSTATE_SCALDING;
if (pPlayer->isAlive() && /*i->getSource()->GetPositionZ() <= -21.434931f*/pPlayer->IsInWater()) else
{ Water = WATERSTATE_FRENZY;
if (Water == WATERSTATE_SCALDING)
{
if (!pPlayer->HasAura(SPELL_SCALDINGWATER)) Map::PlayerList const &PlayerList = instance->GetPlayers();
{ if (PlayerList.isEmpty())
pPlayer->CastSpell(pPlayer, SPELL_SCALDINGWATER,true); return;
} for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
} else if (Water == WATERSTATE_FRENZY) {
if (Player* pPlayer = i->getSource())
{
if (pPlayer->isAlive() && /*i->getSource()->GetPositionZ() <= -21.434931f*/pPlayer->IsInWater())
{ {
//spawn frenzy if (Water == WATERSTATE_SCALDING)
if (DoSpawnFrenzy)
{ {
if (Creature* frenzy = pPlayer->SummonCreature(MOB_COILFANG_FRENZY,pPlayer->GetPositionX(),pPlayer->GetPositionY(),pPlayer->GetPositionZ(),pPlayer->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,2000))
if (!pPlayer->HasAura(SPELL_SCALDINGWATER))
{ {
frenzy->Attack(pPlayer,false); pPlayer->CastSpell(pPlayer, SPELL_SCALDINGWATER,true);
frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING); }
} else if (Water == WATERSTATE_FRENZY)
{
//spawn frenzy
if (DoSpawnFrenzy)
{
if (Creature* frenzy = pPlayer->SummonCreature(MOB_COILFANG_FRENZY,pPlayer->GetPositionX(),pPlayer->GetPositionY(),pPlayer->GetPositionZ(),pPlayer->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,2000))
{
frenzy->Attack(pPlayer,false);
frenzy->AddUnitMovementFlag(MOVEMENTFLAG_SWIMMING | MOVEMENTFLAG_LEVITATING);
}
DoSpawnFrenzy = false;
} }
DoSpawnFrenzy = false;
} }
} }
if (!pPlayer->IsInWater())
pPlayer->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
} }
if (!pPlayer->IsInWater())
pPlayer->RemoveAurasDueToSpell(SPELL_SCALDINGWATER);
}
}
WaterCheckTimer = 500;//remove stress from core
} }
WaterCheckTimer = 500;//remove stress from core else
} else WaterCheckTimer -= diff; WaterCheckTimer -= diff;
if (FrenzySpawnTimer <= diff)
{
DoSpawnFrenzy = true;
FrenzySpawnTimer = 2000;
} else FrenzySpawnTimer -= diff;
}
void OnGameObjectCreate(GameObject* go) if (FrenzySpawnTimer <= diff)
{
switch(go->GetEntry())
{
case 184568:
ControlConsole = go->GetGUID();
go->setActive(true);
break;
case 184203:
BridgePart[0] = go->GetGUID();
go->setActive(true);
break;
case 184204:
BridgePart[1] = go->GetGUID();
go->setActive(true);
break;
case 184205:
BridgePart[2] = go->GetGUID();
go->setActive(true);
break;
case GAMEOBJECT_FISHINGNODE_ENTRY://no way checking if fish is hooked, so we create a timed event
if (LurkerSubEvent == LURKER_NOT_STARTED)
{
FishingTimer = 10000+rand()%30000;//random time before lurker emerges
LurkerSubEvent = LURKER_FISHING;
}
break;
}
}
void OnCreatureCreate(Creature* creature)
{
switch(creature->GetEntry())
{
case 21212: LadyVashj = creature->GetGUID(); break;
case 21214: Karathress = creature->GetGUID(); break;
case 21966: Sharkkis = creature->GetGUID(); break;
case 21217: LurkerBelow = creature->GetGUID(); break;
case 21965: Tidalvess = creature->GetGUID(); break;
case 21964: Caribdis = creature->GetGUID(); break;
case 21215: LeotherasTheBlind = creature->GetGUID(); break;
/*case TRASHMOB_COILFANG_PRIESTESS:
case TRASHMOB_COILFANG_SHATTERER:
if (creature->isAlive())
++TrashCount;
break;*/
}
}
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_KARATHRESSEVENT_STARTER)
KarathressEvent_Starter = data;
if (type == DATA_LEOTHERAS_EVENT_STARTER)
LeotherasEventStarter = data;
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_THELURKERBELOW: return LurkerBelow;
case DATA_SHARKKIS: return Sharkkis;
case DATA_TIDALVESS: return Tidalvess;
case DATA_CARIBDIS: return Caribdis;
case DATA_LADYVASHJ: return LadyVashj;
case DATA_KARATHRESS: return Karathress;
case DATA_KARATHRESSEVENT_STARTER: return KarathressEvent_Starter;
case DATA_LEOTHERAS: return LeotherasTheBlind;
case DATA_LEOTHERAS_EVENT_STARTER: return LeotherasEventStarter;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_STRANGE_POOL:
{ {
StrangePool = data; DoSpawnFrenzy = true;
if (data == NOT_STARTED) FrenzySpawnTimer = 2000;
LurkerSubEvent = LURKER_NOT_STARTED;
} }
break; else
case DATA_CONTROL_CONSOLE: FrenzySpawnTimer -= diff;
}
void OnGameObjectCreate(GameObject* go)
{
switch (go->GetEntry())
{
case 184568:
ControlConsole = go->GetGUID();
go->setActive(true);
break;
case 184203:
BridgePart[0] = go->GetGUID();
go->setActive(true);
break;
case 184204:
BridgePart[1] = go->GetGUID();
go->setActive(true);
break;
case 184205:
BridgePart[2] = go->GetGUID();
go->setActive(true);
break;
default:
break;
}
}
void OnCreatureCreate(Creature* creature)
{
switch (creature->GetEntry())
{
case 21212:
LadyVashj = creature->GetGUID();
break;
case 21214:
Karathress = creature->GetGUID();
break;
case 21966:
Sharkkis = creature->GetGUID();
break;
case 21217:
LurkerBelow = creature->GetGUID();
break;
case 21965:
Tidalvess = creature->GetGUID();
break;
case 21964:
Caribdis = creature->GetGUID();
break;
case 21215:
LeotherasTheBlind = creature->GetGUID();
break;
default:
break;
}
}
void SetData64(uint32 type, uint64 data)
{
if (type == DATA_KARATHRESSEVENT_STARTER)
KarathressEvent_Starter = data;
if (type == DATA_LEOTHERAS_EVENT_STARTER)
LeotherasEventStarter = data;
}
uint64 GetData64(uint32 identifier)
{
switch (identifier)
{
case DATA_THELURKERBELOW:
return LurkerBelow;
case DATA_SHARKKIS:
return Sharkkis;
case DATA_TIDALVESS:
return Tidalvess;
case DATA_CARIBDIS:
return Caribdis;
case DATA_LADYVASHJ:
return LadyVashj;
case DATA_KARATHRESS:
return Karathress;
case DATA_KARATHRESSEVENT_STARTER:
return KarathressEvent_Starter;
case DATA_LEOTHERAS:
return LeotherasTheBlind;
case DATA_LEOTHERAS_EVENT_STARTER:
return LeotherasEventStarter;
default:
break;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch (type)
{
case DATA_STRANGE_POOL:
StrangePool = data;
break;
case DATA_CONTROL_CONSOLE:
if (data == DONE)
{
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
}
ControlConsole = data;
break;
case DATA_TRASH:
if (data == 1 && TrashCount < MIN_KILLS)
++TrashCount;//+1 died
SaveToDB();
break;
case DATA_WATER:
Water = data;
break;
case DATA_HYDROSSTHEUNSTABLEEVENT:
m_auiEncounter[0] = data;
break;
case DATA_LEOTHERASTHEBLINDEVENT:
m_auiEncounter[1] = data;
break;
case DATA_THELURKERBELOWEVENT:
m_auiEncounter[2] = data;
break;
case DATA_KARATHRESSEVENT:
m_auiEncounter[3] = data;
break;
case DATA_MOROGRIMTIDEWALKEREVENT:
m_auiEncounter[4] = data;
break;
//Lady Vashj
case DATA_LADYVASHJEVENT:
if (data == NOT_STARTED)
{
ShieldGeneratorDeactivated[0] = false;
ShieldGeneratorDeactivated[1] = false;
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
}
m_auiEncounter[5] = data;
break;
case DATA_SHIELDGENERATOR1:
ShieldGeneratorDeactivated[0] = data != 0;
break;
case DATA_SHIELDGENERATOR2:
ShieldGeneratorDeactivated[1] = data != 0;
break;
case DATA_SHIELDGENERATOR3:
ShieldGeneratorDeactivated[2] = data != 0;
break;
case DATA_SHIELDGENERATOR4:
ShieldGeneratorDeactivated[3] = data != 0;
break;
default:
break;
}
if (data == DONE) if (data == DONE)
{
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
}
ControlConsole = data;break;
case DATA_TRASH :
{
if (data == 1 && TrashCount < MIN_KILLS)
++TrashCount;//+1 died
SaveToDB(); SaveToDB();
break; }
}
case DATA_WATER : Water = data;break; uint32 GetData(uint32 type)
case DATA_HYDROSSTHEUNSTABLEEVENT: m_auiEncounter[0] = data; break; {
case DATA_LEOTHERASTHEBLINDEVENT: m_auiEncounter[1] = data; break; switch (type)
case DATA_THELURKERBELOWEVENT: m_auiEncounter[2] = data; break;
case DATA_KARATHRESSEVENT: m_auiEncounter[3] = data; break;
case DATA_MOROGRIMTIDEWALKEREVENT: m_auiEncounter[4] = data; break;
//Lady Vashj
case DATA_LADYVASHJEVENT:
if (data == NOT_STARTED)
{ {
ShieldGeneratorDeactivated[0] = false; case DATA_HYDROSSTHEUNSTABLEEVENT:
ShieldGeneratorDeactivated[1] = false; return m_auiEncounter[0];
ShieldGeneratorDeactivated[2] = false; case DATA_LEOTHERASTHEBLINDEVENT:
ShieldGeneratorDeactivated[3] = false; return m_auiEncounter[1];
case DATA_THELURKERBELOWEVENT:
return m_auiEncounter[2];
case DATA_KARATHRESSEVENT:
return m_auiEncounter[3];
case DATA_MOROGRIMTIDEWALKEREVENT:
return m_auiEncounter[4];
//Lady Vashj
case DATA_LADYVASHJEVENT:
return m_auiEncounter[5];
case DATA_SHIELDGENERATOR1:
return ShieldGeneratorDeactivated[0];
case DATA_SHIELDGENERATOR2:
return ShieldGeneratorDeactivated[1];
case DATA_SHIELDGENERATOR3:
return ShieldGeneratorDeactivated[2];
case DATA_SHIELDGENERATOR4:
return ShieldGeneratorDeactivated[3];
case DATA_CANSTARTPHASE3:
if (ShieldGeneratorDeactivated[0] && ShieldGeneratorDeactivated[1] && ShieldGeneratorDeactivated[2] && ShieldGeneratorDeactivated[3])
return 1;
break;
case DATA_STRANGE_POOL:
return StrangePool;
case DATA_WATER:
return Water;
default:
break;
} }
m_auiEncounter[5] = data; break;
case DATA_SHIELDGENERATOR1:ShieldGeneratorDeactivated[0] = (data) ? true : false; break; return 0;
case DATA_SHIELDGENERATOR2:ShieldGeneratorDeactivated[1] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR3:ShieldGeneratorDeactivated[2] = (data) ? true : false; break;
case DATA_SHIELDGENERATOR4:ShieldGeneratorDeactivated[3] = (data) ? true : false; break;
} }
if (data == DONE) std::string GetSaveData()
SaveToDB();
}
uint32 GetData(uint32 type)
{
switch(type)
{
case DATA_HYDROSSTHEUNSTABLEEVENT: return m_auiEncounter[0];
case DATA_LEOTHERASTHEBLINDEVENT: return m_auiEncounter[1];
case DATA_THELURKERBELOWEVENT: return m_auiEncounter[2];
case DATA_KARATHRESSEVENT: return m_auiEncounter[3];
case DATA_MOROGRIMTIDEWALKEREVENT: return m_auiEncounter[4];
//Lady Vashj
case DATA_LADYVASHJEVENT: return m_auiEncounter[5];
case DATA_SHIELDGENERATOR1: return ShieldGeneratorDeactivated[0];
case DATA_SHIELDGENERATOR2: return ShieldGeneratorDeactivated[1];
case DATA_SHIELDGENERATOR3: return ShieldGeneratorDeactivated[2];
case DATA_SHIELDGENERATOR4: return ShieldGeneratorDeactivated[3];
case DATA_CANSTARTPHASE3:
if (ShieldGeneratorDeactivated[0] && ShieldGeneratorDeactivated[1] && ShieldGeneratorDeactivated[2] && ShieldGeneratorDeactivated[3])return 1;break;
case DATA_STRANGE_POOL: return StrangePool;
case DATA_WATER: return Water;
}
return 0;
}
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
<< m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << TrashCount;
char* out = new char[stream.str().length() + 1];
strcpy(out, stream.str().c_str());
if (out)
{ {
OUT_SAVE_INST_DATA;
std::ostringstream stream;
stream << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " "
<< m_auiEncounter[3] << " " << m_auiEncounter[4] << " " << m_auiEncounter[5] << " " << TrashCount;
OUT_SAVE_INST_DATA_COMPLETE; OUT_SAVE_INST_DATA_COMPLETE;
return out; return stream.str();
} }
return NULL;
}
void Load(const char* in) void Load(const char* in)
{
if (!in)
{ {
OUT_LOAD_INST_DATA_FAIL; if (!in)
return; {
} OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA(in); return;
std::istringstream stream(in); }
stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
>> m_auiEncounter[4] >> m_auiEncounter[5] >> TrashCount;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
};
OUT_LOAD_INST_DATA(in);
std::istringstream stream(in);
stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
>> m_auiEncounter[4] >> m_auiEncounter[5] >> TrashCount;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
private:
uint64 LurkerBelow;
uint64 Sharkkis;
uint64 Tidalvess;
uint64 Caribdis;
uint64 LadyVashj;
uint64 Karathress;
uint64 KarathressEvent_Starter;
uint64 LeotherasTheBlind;
uint64 LeotherasEventStarter;
uint64 ControlConsole;
uint64 BridgePart[3];
uint32 StrangePool;
uint32 FishingTimer;
uint32 WaterCheckTimer;
uint32 FrenzySpawnTimer;
uint32 Water;
uint32 TrashCount;
bool ShieldGeneratorDeactivated[4];
uint32 m_auiEncounter[MAX_ENCOUNTER];
bool DoSpawnFrenzy;
};
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
return new instance_serpentshrine_cavern_InstanceMapScript(pMap);
}
}; };
@@ -18,42 +18,42 @@
#ifndef DEF_SERPENT_SHRINE_H #ifndef DEF_SERPENT_SHRINE_H
#define DEF_SERPENT_SHRINE_H #define DEF_SERPENT_SHRINE_H
enum LurkerEventState
{
LURKER_NOT_STARTED = 0,
LURKER_FISHING = 1,
LURKER_HOOKED = 2
};
enum WaterEventState enum WaterEventState
{ {
WATERSTATE_NONE = 0, WATERSTATE_NONE = 0,
WATERSTATE_FRENZY = 1, WATERSTATE_FRENZY = 1,
WATERSTATE_SCALDING = 2 WATERSTATE_SCALDING = 2
}; };
#define DATA_CANSTARTPHASE3 1
#define DATA_CARIBDIS 2 enum DataTypes
#define DATA_HYDROSSTHEUNSTABLEEVENT 3 {
#define DATA_KARATHRESS 4 DATA_CANSTARTPHASE3 = 1,
#define DATA_KARATHRESSEVENT 5 DATA_CARIBDIS = 2,
#define DATA_KARATHRESSEVENT_STARTER 6 DATA_HYDROSSTHEUNSTABLEEVENT = 3,
#define DATA_LADYVASHJ 7 DATA_KARATHRESS = 4,
#define DATA_LADYVASHJEVENT 8 DATA_KARATHRESSEVENT = 5,
#define DATA_LEOTHERASTHEBLINDEVENT 9 DATA_KARATHRESSEVENT_STARTER = 6,
#define DATA_MOROGRIMTIDEWALKEREVENT 10 DATA_LADYVASHJ = 7,
#define DATA_SHARKKIS 11 DATA_LADYVASHJEVENT = 8,
#define DATA_SHIELDGENERATOR1 12 DATA_LEOTHERASTHEBLINDEVENT = 9,
#define DATA_SHIELDGENERATOR2 13 DATA_MOROGRIMTIDEWALKEREVENT = 10,
#define DATA_SHIELDGENERATOR3 14 DATA_SHARKKIS = 11,
#define DATA_SHIELDGENERATOR4 15 DATA_SHIELDGENERATOR1 = 12,
#define DATA_THELURKERBELOW 16 DATA_SHIELDGENERATOR2 = 13,
#define DATA_THELURKERBELOWEVENT 17 DATA_SHIELDGENERATOR3 = 14,
#define DATA_TIDALVESS 18 DATA_SHIELDGENERATOR4 = 15,
#define DATA_FATHOMLORDKARATHRESSEVENT 19 DATA_THELURKERBELOW = 16,
#define DATA_LEOTHERAS 20 DATA_THELURKERBELOWEVENT = 17,
#define DATA_LEOTHERAS_EVENT_STARTER 21 DATA_TIDALVESS = 18,
#define DATA_CONTROL_CONSOLE 22 DATA_FATHOMLORDKARATHRESSEVENT = 19,
#define DATA_STRANGE_POOL 23 DATA_LEOTHERAS = 20,
#define DATA_WATER 24 DATA_LEOTHERAS_EVENT_STARTER = 21,
#define DATA_TRASH 25 DATA_CONTROL_CONSOLE = 22,
DATA_STRANGE_POOL = 23,
DATA_WATER = 24,
DATA_TRASH = 25,
};
#endif #endif