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;
bool triggered = false;
if (Player* playerUser = user->ToPlayer())
{
if (sScriptMgr->OnGossipHello(playerUser, this))
return;
AI()->GossipHello(playerUser);
}
switch(GetGoType())
{
case GAMEOBJECT_TYPE_DOOR: //0
@@ -1238,15 +1246,14 @@ void GameObject::Use(Unit* user)
//fishing bobber
case GAMEOBJECT_TYPE_FISHINGNODE: //17
{
if (user->GetTypeId() != TYPEID_PLAYER)
Player* player = user->ToPlayer();
if (!player)
return;
Player* player = (Player*)user;
if (player->GetGUID() != GetOwnerGUID())
return;
switch(getLootState())
switch (getLootState())
{
case GO_READY: // ready for loot
{
@@ -294,11 +294,6 @@ void WorldSession::HandleGameObjectUseOpcode(WorldPacket & recv_data)
if (!obj)
return;
if (sScriptMgr->OnGossipHello(_player, obj))
return;
obj->AI()->GossipHello(_player);
obj->Use(_player);
}
+8 -5
View File
@@ -2631,12 +2631,19 @@ void Spell::EffectEnergizePct(SpellEffIndex effIndex)
void Spell::SendLoot(uint64 guid, LootType loottype)
{
Player* player = (Player*)m_caster;
Player* player = m_caster->ToPlayer();
if (!player)
return;
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))
return;
@@ -2662,10 +2669,6 @@ void Spell::SendLoot(uint64 guid, LootType loottype)
gameObjTarget->TriggeringLinkedGameObject(trapEntry,m_caster);
return;
case GAMEOBJECT_TYPE_GOOBER:
gameObjTarget->Use(m_caster);
return;
case GAMEOBJECT_TYPE_CHEST:
// TODO: possible must be moved to loot release (in different from linked triggering)
if (gameObjTarget->GetGOInfo()->chest.eventId)
@@ -149,7 +149,10 @@ public:
void JustDied(Unit* /*Killer*/)
{
if (pInstance)
{
pInstance->SetData(DATA_THELURKERBELOWEVENT, DONE);
pInstance->SetData(DATA_STRANGE_POOL, IN_PROGRESS);
}
Summons.DespawnAll();
}
@@ -193,22 +196,27 @@ public:
Submerged = false;
WaitTimer2 = 500;
}
if (!Submerged && WaitTimer2 <= diff)//wait 500ms before emerge anim
{
me->RemoveAllAuras();
me->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
DoCast(me, SPELL_EMERGE, false);
WaitTimer2 = 60000;//never reached
WaitTimer = 3000;
} else WaitTimer2 -= diff;
}
else
WaitTimer2 -= diff;
if (WaitTimer <= diff)//wait 3secs for emerge anim, then attack
{
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_NOT_SELECTABLE);
} else WaitTimer -= diff;
}
else
WaitTimer -= diff;
}
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()
{
new boss_the_lurker_below();
new mob_coilfang_guardian();
new mob_coilfang_ambusher();
new go_strange_pool();
}
@@ -49,7 +49,7 @@ EndScriptData */
class go_bridge_console : public GameObjectScript
{
public:
public:
go_bridge_console() : GameObjectScript("go_bridge_console") { }
bool OnGossipHello(Player* /*pPlayer*/, GameObject* go)
@@ -64,46 +64,19 @@ public:
return true;
}
};
class instance_serpent_shrine : public InstanceMapScript
{
public:
public:
instance_serpent_shrine() : InstanceMapScript("instance_serpent_shrine", 548) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
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;
instance_serpentshrine_cavern_InstanceMapScript(Map* pMap) : InstanceScript(pMap)
{
Initialize();
}
void Initialize()
{
@@ -131,7 +104,6 @@ public:
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
FishingTimer = 1000;
LurkerSubEvent = 0;
WaterCheckTimer = 500;
FrenzySpawnTimer = 2000;
DoSpawnFrenzy = false;
@@ -142,22 +114,14 @@ public:
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
void Update (uint32 diff)
void Update(uint32 diff)
{
//Lurker Fishing event
if (LurkerSubEvent == LURKER_FISHING)
{
if (FishingTimer <= diff)
{
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)
{
@@ -202,63 +166,71 @@ public:
}
WaterCheckTimer = 500;//remove stress from core
} else WaterCheckTimer -= diff;
}
else
WaterCheckTimer -= diff;
if (FrenzySpawnTimer <= diff)
{
DoSpawnFrenzy = true;
FrenzySpawnTimer = 2000;
} else FrenzySpawnTimer -= diff;
}
else
FrenzySpawnTimer -= diff;
}
void OnGameObjectCreate(GameObject* go)
{
switch(go->GetEntry())
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;
}
default:
break;
}
}
void OnCreatureCreate(Creature* creature)
{
switch(creature->GetEntry())
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;*/
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;
}
}
@@ -272,31 +244,38 @@ public:
uint64 GetData64(uint32 identifier)
{
switch(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;
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)
switch (type)
{
case DATA_STRANGE_POOL:
{
StrangePool = data;
if (data == NOT_STARTED)
LurkerSubEvent = LURKER_NOT_STARTED;
}
break;
case DATA_CONTROL_CONSOLE:
if (data == DONE)
@@ -305,20 +284,31 @@ public:
HandleGameObject(BridgePart[0], true);
HandleGameObject(BridgePart[0], true);
}
ControlConsole = data;break;
case DATA_TRASH :
{
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;
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)
@@ -328,11 +318,22 @@ public:
ShieldGeneratorDeactivated[2] = false;
ShieldGeneratorDeactivated[3] = false;
}
m_auiEncounter[5] = data; break;
case DATA_SHIELDGENERATOR1:ShieldGeneratorDeactivated[0] = (data) ? true : false; break;
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;
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)
@@ -341,40 +342,52 @@ public:
uint32 GetData(uint32 type)
{
switch(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];
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_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;
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;
}
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_COMPLETE;
return out;
}
return NULL;
return stream.str();
}
void Load(const char* in)
@@ -384,17 +397,48 @@ public:
OUT_LOAD_INST_DATA_FAIL;
return;
}
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
#define DEF_SERPENT_SHRINE_H
enum LurkerEventState
{
LURKER_NOT_STARTED = 0,
LURKER_FISHING = 1,
LURKER_HOOKED = 2
};
enum WaterEventState
{
WATERSTATE_NONE = 0,
WATERSTATE_FRENZY = 1,
WATERSTATE_SCALDING = 2
};
#define DATA_CANSTARTPHASE3 1
#define DATA_CARIBDIS 2
#define DATA_HYDROSSTHEUNSTABLEEVENT 3
#define DATA_KARATHRESS 4
#define DATA_KARATHRESSEVENT 5
#define DATA_KARATHRESSEVENT_STARTER 6
#define DATA_LADYVASHJ 7
#define DATA_LADYVASHJEVENT 8
#define DATA_LEOTHERASTHEBLINDEVENT 9
#define DATA_MOROGRIMTIDEWALKEREVENT 10
#define DATA_SHARKKIS 11
#define DATA_SHIELDGENERATOR1 12
#define DATA_SHIELDGENERATOR2 13
#define DATA_SHIELDGENERATOR3 14
#define DATA_SHIELDGENERATOR4 15
#define DATA_THELURKERBELOW 16
#define DATA_THELURKERBELOWEVENT 17
#define DATA_TIDALVESS 18
#define DATA_FATHOMLORDKARATHRESSEVENT 19
#define DATA_LEOTHERAS 20
#define DATA_LEOTHERAS_EVENT_STARTER 21
#define DATA_CONTROL_CONSOLE 22
#define DATA_STRANGE_POOL 23
#define DATA_WATER 24
#define DATA_TRASH 25
enum DataTypes
{
DATA_CANSTARTPHASE3 = 1,
DATA_CARIBDIS = 2,
DATA_HYDROSSTHEUNSTABLEEVENT = 3,
DATA_KARATHRESS = 4,
DATA_KARATHRESSEVENT = 5,
DATA_KARATHRESSEVENT_STARTER = 6,
DATA_LADYVASHJ = 7,
DATA_LADYVASHJEVENT = 8,
DATA_LEOTHERASTHEBLINDEVENT = 9,
DATA_MOROGRIMTIDEWALKEREVENT = 10,
DATA_SHARKKIS = 11,
DATA_SHIELDGENERATOR1 = 12,
DATA_SHIELDGENERATOR2 = 13,
DATA_SHIELDGENERATOR3 = 14,
DATA_SHIELDGENERATOR4 = 15,
DATA_THELURKERBELOW = 16,
DATA_THELURKERBELOWEVENT = 17,
DATA_TIDALVESS = 18,
DATA_FATHOMLORDKARATHRESSEVENT = 19,
DATA_LEOTHERAS = 20,
DATA_LEOTHERAS_EVENT_STARTER = 21,
DATA_CONTROL_CONSOLE = 22,
DATA_STRANGE_POOL = 23,
DATA_WATER = 24,
DATA_TRASH = 25,
};
#endif