Scripts/Serpentshrine Cavern: Fixed "The Lurker Above" achievement and removed hacks for the event
--HG-- branch : trunk
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
+350
-306
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user