Scripts/Stratholme: Cleaned up instance script a bit
This commit is contained in:
@@ -68,11 +68,11 @@ public:
|
||||
for (uint8 i = 0; i < 30; ++i)
|
||||
{
|
||||
if (Creature* mob = me->SummonCreature(C_MINDLESS_UNDEAD,3969.35f+irand(-10,10),-3391.87f+irand(-10,10),119.11f,5.91f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000))
|
||||
mob->AI()->AttackStart(me->SelectNearestTarget(500));
|
||||
mob->AI()->AttackStart(me->SelectNearestTarget(100.0f));
|
||||
}
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(TYPE_RAMSTEIN,DONE);
|
||||
pInstance->SetData(TYPE_RAMSTEIN, DONE);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
|
||||
@@ -49,411 +49,427 @@ EndScriptData */
|
||||
|
||||
#define MAX_ENCOUNTER 6
|
||||
|
||||
enum InstanceEvents
|
||||
{
|
||||
EVENT_BARON_RUN = 1,
|
||||
EVENT_SLAUGHTER_SQUARE = 2,
|
||||
};
|
||||
|
||||
class instance_stratholme : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_stratholme() : InstanceMapScript("instance_stratholme", 329) { }
|
||||
public:
|
||||
instance_stratholme() : InstanceMapScript("instance_stratholme", 329) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_stratholme_InstanceMapScript(pMap);
|
||||
}
|
||||
|
||||
struct instance_stratholme_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_stratholme_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {}
|
||||
|
||||
uint32 Encounter[MAX_ENCOUNTER];
|
||||
|
||||
bool IsSilverHandDead[5];
|
||||
|
||||
uint32 BaronRun_Timer;
|
||||
uint32 SlaugtherSquare_Timer;
|
||||
|
||||
uint64 serviceEntranceGUID;
|
||||
uint64 gauntletGate1GUID;
|
||||
uint64 ziggurat1GUID;
|
||||
uint64 ziggurat2GUID;
|
||||
uint64 ziggurat3GUID;
|
||||
uint64 ziggurat4GUID;
|
||||
uint64 ziggurat5GUID;
|
||||
uint64 portGauntletGUID;
|
||||
uint64 portSlaugtherGUID;
|
||||
uint64 portElderGUID;
|
||||
|
||||
uint64 baronGUID;
|
||||
uint64 ysidaTriggerGUID;
|
||||
std::set<uint64> crystalsGUID;
|
||||
std::set<uint64> abomnationGUID;
|
||||
|
||||
void Initialize()
|
||||
struct instance_stratholme_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
Encounter[i] = NOT_STARTED;
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
IsSilverHandDead[i] = false;
|
||||
|
||||
BaronRun_Timer = 0;
|
||||
SlaugtherSquare_Timer = 0;
|
||||
|
||||
serviceEntranceGUID = 0;
|
||||
gauntletGate1GUID = 0;
|
||||
ziggurat1GUID = 0;
|
||||
ziggurat2GUID = 0;
|
||||
ziggurat3GUID = 0;
|
||||
ziggurat4GUID = 0;
|
||||
ziggurat5GUID = 0;
|
||||
portGauntletGUID = 0;
|
||||
portSlaugtherGUID = 0;
|
||||
portElderGUID = 0;
|
||||
|
||||
baronGUID = 0;
|
||||
ysidaTriggerGUID = 0;
|
||||
crystalsGUID.clear();
|
||||
abomnationGUID.clear();
|
||||
}
|
||||
|
||||
bool StartSlaugtherSquare()
|
||||
{
|
||||
//change to DONE when crystals implemented
|
||||
if (Encounter[1] == IN_PROGRESS && Encounter[2] == IN_PROGRESS && Encounter[3] == IN_PROGRESS)
|
||||
instance_stratholme_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
HandleGameObject(portGauntletGUID, true);
|
||||
HandleGameObject(portSlaugtherGUID, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Cannot open slaugther square yet.");
|
||||
return false;
|
||||
}
|
||||
uint32 EncounterState[MAX_ENCOUNTER];
|
||||
|
||||
//if withRestoreTime true, then newState will be ignored and GO should be restored to original state after 10 seconds
|
||||
void UpdateGoState(uint64 goGuid, uint32 newState, bool withRestoreTime)
|
||||
{
|
||||
if (!goGuid)
|
||||
return;
|
||||
bool IsSilverHandDead[5];
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(goGuid))
|
||||
uint64 serviceEntranceGUID;
|
||||
uint64 gauntletGate1GUID;
|
||||
uint64 ziggurat1GUID;
|
||||
uint64 ziggurat2GUID;
|
||||
uint64 ziggurat3GUID;
|
||||
uint64 ziggurat4GUID;
|
||||
uint64 ziggurat5GUID;
|
||||
uint64 portGauntletGUID;
|
||||
uint64 portSlaugtherGUID;
|
||||
uint64 portElderGUID;
|
||||
|
||||
uint64 baronGUID;
|
||||
uint64 ysidaTriggerGUID;
|
||||
std::set<uint64> crystalsGUID;
|
||||
std::set<uint64> abomnationGUID;
|
||||
EventMap events;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
if (withRestoreTime)
|
||||
go->UseDoorOrButton(10);
|
||||
else
|
||||
go->SetGoState((GOState)newState);
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
EncounterState[i] = NOT_STARTED;
|
||||
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
IsSilverHandDead[i] = false;
|
||||
|
||||
serviceEntranceGUID = 0;
|
||||
gauntletGate1GUID = 0;
|
||||
ziggurat1GUID = 0;
|
||||
ziggurat2GUID = 0;
|
||||
ziggurat3GUID = 0;
|
||||
ziggurat4GUID = 0;
|
||||
ziggurat5GUID = 0;
|
||||
portGauntletGUID = 0;
|
||||
portSlaugtherGUID = 0;
|
||||
portElderGUID = 0;
|
||||
|
||||
baronGUID = 0;
|
||||
ysidaTriggerGUID = 0;
|
||||
crystalsGUID.clear();
|
||||
abomnationGUID.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch(creature->GetEntry())
|
||||
bool StartSlaugtherSquare()
|
||||
{
|
||||
case C_BARON: baronGUID = creature->GetGUID(); break;
|
||||
case C_YSIDA_TRIGGER: ysidaTriggerGUID = creature->GetGUID(); break;
|
||||
case C_CRYSTAL: crystalsGUID.insert(creature->GetGUID()); break;
|
||||
case C_ABOM_BILE:
|
||||
case C_ABOM_VENOM: abomnationGUID.insert(creature->GetGUID()); break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch(go->GetEntry())
|
||||
{
|
||||
case GO_SERVICE_ENTRANCE:
|
||||
serviceEntranceGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_GAUNTLET_GATE1:
|
||||
//weird, but unless flag is set, client will not respond as expected. DB bug?
|
||||
go->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_LOCKED);
|
||||
gauntletGate1GUID = go->GetGUID();
|
||||
break;
|
||||
case GO_ZIGGURAT1:
|
||||
ziggurat1GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT2:
|
||||
ziggurat2GUID = go->GetGUID();
|
||||
if (GetData(TYPE_NERUB) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT3:
|
||||
ziggurat3GUID = go->GetGUID();
|
||||
if (GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT4:
|
||||
ziggurat4GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT5:
|
||||
ziggurat5GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_GAUNTLET:
|
||||
portGauntletGUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_SLAUGTHER:
|
||||
portSlaugtherGUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_ELDERS:
|
||||
portElderGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case TYPE_BARON_RUN:
|
||||
switch(data)
|
||||
//change to DONE when crystals implemented
|
||||
if (EncounterState[1] == IN_PROGRESS && EncounterState[2] == IN_PROGRESS && EncounterState[3] == IN_PROGRESS)
|
||||
{
|
||||
case IN_PROGRESS:
|
||||
if (Encounter[0] == IN_PROGRESS || Encounter[0] == FAIL)
|
||||
break;
|
||||
Encounter[0] = data;
|
||||
BaronRun_Timer = 2700000;
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Baron run in progress.");
|
||||
break;
|
||||
case FAIL:
|
||||
//may add code to remove aura from players, but in theory the time should be up already and removed.
|
||||
Encounter[0] = data;
|
||||
break;
|
||||
case DONE:
|
||||
Encounter[0] = data;
|
||||
if (Creature* pYsidaT = instance->GetCreature(ysidaTriggerGUID))
|
||||
pYsidaT->SummonCreature(C_YSIDA,
|
||||
pYsidaT->GetPositionX(),pYsidaT->GetPositionY(),pYsidaT->GetPositionZ(),pYsidaT->GetOrientation(),
|
||||
TEMPSUMMON_TIMED_DESPAWN,1800000);
|
||||
BaronRun_Timer = 0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TYPE_BARONESS:
|
||||
Encounter[1] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat1GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_NERUB:
|
||||
Encounter[2] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat2GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_PALLID:
|
||||
Encounter[3] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat3GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_RAMSTEIN:
|
||||
if (data == IN_PROGRESS)
|
||||
{
|
||||
HandleGameObject(portGauntletGUID, false);
|
||||
|
||||
uint32 count = abomnationGUID.size();
|
||||
for (std::set<uint64>::const_iterator i = abomnationGUID.begin(); i != abomnationGUID.end(); ++i)
|
||||
{
|
||||
if (Creature* pAbom = instance->GetCreature(*i))
|
||||
{
|
||||
if (!pAbom->isAlive())
|
||||
--count;
|
||||
}
|
||||
}
|
||||
|
||||
if (!count)
|
||||
{
|
||||
//a bit itchy, it should close the door after 10 secs, but it doesn't. skipping it for now.
|
||||
//UpdateGoState(ziggurat4GUID,0,true);
|
||||
if (Creature* pBaron = instance->GetCreature(baronGUID))
|
||||
pBaron->SummonCreature(C_RAMSTEIN,4032.84f,-3390.24f,119.73f,4.71f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Ramstein spawned.");
|
||||
}
|
||||
else
|
||||
sLog->outDebug("TSCR: Instance Stratholme: %u Abomnation left to kill.",count);
|
||||
}
|
||||
|
||||
if (data == NOT_STARTED)
|
||||
HandleGameObject(portGauntletGUID, true);
|
||||
|
||||
if (data == DONE)
|
||||
{
|
||||
SlaugtherSquare_Timer = 300000;
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Slaugther event will continue in 5 minutes.");
|
||||
HandleGameObject(portSlaugtherGUID, true);
|
||||
return true;
|
||||
}
|
||||
Encounter[4] = data;
|
||||
break;
|
||||
case TYPE_BARON:
|
||||
if (data == IN_PROGRESS)
|
||||
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Cannot open slaugther square yet.");
|
||||
return false;
|
||||
}
|
||||
|
||||
//if withRestoreTime true, then newState will be ignored and GO should be restored to original state after 10 seconds
|
||||
void UpdateGoState(uint64 goGuid, uint32 newState, bool withRestoreTime)
|
||||
{
|
||||
if (!goGuid)
|
||||
return;
|
||||
|
||||
if (GameObject* go = instance->GetGameObject(goGuid))
|
||||
{
|
||||
HandleGameObject(ziggurat4GUID, false);
|
||||
HandleGameObject(ziggurat5GUID, false);
|
||||
if (GetData(TYPE_BARON_RUN) == IN_PROGRESS)
|
||||
{
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (withRestoreTime)
|
||||
go->UseDoorOrButton(10);
|
||||
else
|
||||
go->SetGoState((GOState)newState);
|
||||
}
|
||||
}
|
||||
|
||||
if (!players.isEmpty())
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case C_BARON:
|
||||
baronGUID = creature->GetGUID();
|
||||
break;
|
||||
case C_YSIDA_TRIGGER:
|
||||
ysidaTriggerGUID = creature->GetGUID();
|
||||
break;
|
||||
case C_CRYSTAL:
|
||||
crystalsGUID.insert(creature->GetGUID());
|
||||
break;
|
||||
case C_ABOM_BILE:
|
||||
case C_ABOM_VENOM:
|
||||
abomnationGUID.insert(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureRemove(Creature* creature)
|
||||
{
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case C_CRYSTAL:
|
||||
crystalsGUID.erase(creature->GetGUID());
|
||||
break;
|
||||
case C_ABOM_BILE:
|
||||
case C_ABOM_VENOM:
|
||||
abomnationGUID.erase(creature->GetGUID());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_SERVICE_ENTRANCE:
|
||||
serviceEntranceGUID = go->GetGUID();
|
||||
break;
|
||||
case GO_GAUNTLET_GATE1:
|
||||
//weird, but unless flag is set, client will not respond as expected. DB bug?
|
||||
go->SetFlag(GAMEOBJECT_FLAGS,GO_FLAG_LOCKED);
|
||||
gauntletGate1GUID = go->GetGUID();
|
||||
break;
|
||||
case GO_ZIGGURAT1:
|
||||
ziggurat1GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT2:
|
||||
ziggurat2GUID = go->GetGUID();
|
||||
if (GetData(TYPE_NERUB) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT3:
|
||||
ziggurat3GUID = go->GetGUID();
|
||||
if (GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT4:
|
||||
ziggurat4GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_ZIGGURAT5:
|
||||
ziggurat5GUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARON) == DONE || GetData(TYPE_RAMSTEIN) == DONE)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_GAUNTLET:
|
||||
portGauntletGUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_SLAUGTHER:
|
||||
portSlaugtherGUID = go->GetGUID();
|
||||
if (GetData(TYPE_BARONESS) == IN_PROGRESS && GetData(TYPE_NERUB) == IN_PROGRESS && GetData(TYPE_PALLID) == IN_PROGRESS)
|
||||
HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_PORT_ELDERS:
|
||||
portElderGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_BARON_RUN:
|
||||
switch (data)
|
||||
{
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
{
|
||||
if (Player* pPlayer = itr->getSource())
|
||||
case IN_PROGRESS:
|
||||
if (EncounterState[0] == IN_PROGRESS || EncounterState[0] == FAIL)
|
||||
break;
|
||||
EncounterState[0] = data;
|
||||
events.ScheduleEvent(EVENT_BARON_RUN, 2700000);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Baron run in progress.");
|
||||
break;
|
||||
case FAIL:
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
|
||||
EncounterState[0] = data;
|
||||
break;
|
||||
case DONE:
|
||||
EncounterState[0] = data;
|
||||
if (Creature* ysidaTrigger = instance->GetCreature(ysidaTriggerGUID))
|
||||
{
|
||||
if (pPlayer->HasAura(SPELL_BARON_ULTIMATUM))
|
||||
pPlayer->RemoveAurasDueToSpell(SPELL_BARON_ULTIMATUM);
|
||||
|
||||
if (pPlayer->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE)
|
||||
pPlayer->AreaExploredOrEventHappens(QUEST_DEAD_MAN_PLEA);
|
||||
Position ysidaPos;
|
||||
ysidaTrigger->GetPosition(&ysidaPos);
|
||||
ysidaTrigger->SummonCreature(C_YSIDA, ysidaPos, TEMPSUMMON_TIMED_DESPAWN, 1800000);
|
||||
}
|
||||
events.CancelEvent(EVENT_BARON_RUN);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TYPE_BARONESS:
|
||||
EncounterState[1] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat1GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_NERUB:
|
||||
EncounterState[2] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat2GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_PALLID:
|
||||
EncounterState[3] = data;
|
||||
if (data == IN_PROGRESS)
|
||||
HandleGameObject(ziggurat3GUID, true);
|
||||
if (data == IN_PROGRESS) //change to DONE when crystals implemented
|
||||
StartSlaugtherSquare();
|
||||
break;
|
||||
case TYPE_RAMSTEIN:
|
||||
if (data == IN_PROGRESS)
|
||||
{
|
||||
HandleGameObject(portGauntletGUID, false);
|
||||
|
||||
uint32 count = abomnationGUID.size();
|
||||
for (std::set<uint64>::const_iterator i = abomnationGUID.begin(); i != abomnationGUID.end(); ++i)
|
||||
{
|
||||
if (Creature* pAbom = instance->GetCreature(*i))
|
||||
if (!pAbom->isAlive())
|
||||
--count;
|
||||
}
|
||||
|
||||
if (!count)
|
||||
{
|
||||
//a bit itchy, it should close the door after 10 secs, but it doesn't. skipping it for now.
|
||||
//UpdateGoState(ziggurat4GUID,0,true);
|
||||
if (Creature* pBaron = instance->GetCreature(baronGUID))
|
||||
pBaron->SummonCreature(C_RAMSTEIN, 4032.84f, -3390.24f, 119.73f, 4.71f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1800000);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Ramstein spawned.");
|
||||
}
|
||||
else
|
||||
sLog->outDebug("TSCR: Instance Stratholme: %u Abomnation left to kill.",count);
|
||||
}
|
||||
|
||||
if (data == NOT_STARTED)
|
||||
HandleGameObject(portGauntletGUID, true);
|
||||
|
||||
if (data == DONE)
|
||||
{
|
||||
events.ScheduleEvent(EVENT_SLAUGHTER_SQUARE, 60000);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Slaugther event will continue in 1 minute.");
|
||||
}
|
||||
EncounterState[4] = data;
|
||||
break;
|
||||
case TYPE_BARON:
|
||||
if (data == IN_PROGRESS)
|
||||
{
|
||||
HandleGameObject(ziggurat4GUID, false);
|
||||
HandleGameObject(ziggurat5GUID, false);
|
||||
if (GetData(TYPE_BARON_RUN) == IN_PROGRESS)
|
||||
{
|
||||
DoRemoveAurasDueToSpellOnPlayers(SPELL_BARON_ULTIMATUM);
|
||||
Map::PlayerList const& players = instance->GetPlayers();
|
||||
if (!players.isEmpty())
|
||||
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
|
||||
if (Player* player = itr->getSource())
|
||||
if (player->GetQuestStatus(QUEST_DEAD_MAN_PLEA) == QUEST_STATUS_INCOMPLETE)
|
||||
player->AreaExploredOrEventHappens(QUEST_DEAD_MAN_PLEA);
|
||||
|
||||
SetData(TYPE_BARON_RUN,DONE);
|
||||
}
|
||||
}
|
||||
if (data == DONE || data == NOT_STARTED)
|
||||
{
|
||||
HandleGameObject(ziggurat4GUID, true);
|
||||
HandleGameObject(ziggurat5GUID, true);
|
||||
}
|
||||
if (data == DONE)
|
||||
HandleGameObject(portGauntletGUID, true);
|
||||
EncounterState[5] = data;
|
||||
break;
|
||||
case TYPE_SH_AELMAR:
|
||||
IsSilverHandDead[0] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_CATHELA:
|
||||
IsSilverHandDead[1] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_GREGOR:
|
||||
IsSilverHandDead[2] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_NEMAS:
|
||||
IsSilverHandDead[3] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_VICAR:
|
||||
IsSilverHandDead[4] = (data) ? true : false;
|
||||
break;
|
||||
}
|
||||
|
||||
SetData(TYPE_BARON_RUN,DONE);
|
||||
}
|
||||
}
|
||||
if (data == DONE || data == NOT_STARTED)
|
||||
{
|
||||
HandleGameObject(ziggurat4GUID, true);
|
||||
HandleGameObject(ziggurat5GUID, true);
|
||||
}
|
||||
if (data == DONE)
|
||||
HandleGameObject(portGauntletGUID, true);
|
||||
Encounter[5] = data;
|
||||
break;
|
||||
case TYPE_SH_AELMAR:
|
||||
IsSilverHandDead[0] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_CATHELA:
|
||||
IsSilverHandDead[1] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_GREGOR:
|
||||
IsSilverHandDead[2] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_NEMAS:
|
||||
IsSilverHandDead[3] = (data) ? true : false;
|
||||
break;
|
||||
case TYPE_SH_VICAR:
|
||||
IsSilverHandDead[4] = (data) ? true : false;
|
||||
break;
|
||||
SaveToDB();
|
||||
}
|
||||
if (data == DONE)SaveToDB();
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << Encounter[0] << " " << Encounter[1] << " " << Encounter[2] << " "
|
||||
<< Encounter[3] << " " << Encounter[4] << " " << Encounter[5];
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << EncounterState[0] << " " << EncounterState[1] << " " << EncounterState[2] << " "
|
||||
<< EncounterState[3] << " " << EncounterState[4] << " " << EncounterState[5];
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> Encounter[0] >> Encounter[1] >> Encounter[2] >> Encounter[3]
|
||||
>> Encounter[4] >> Encounter[5];
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
// Do not reset 1, 2 and 3. they are not set to done, yet .
|
||||
if (Encounter[0] == IN_PROGRESS)
|
||||
Encounter[0] = NOT_STARTED;
|
||||
if (Encounter[4] == IN_PROGRESS)
|
||||
Encounter[4] = NOT_STARTED;
|
||||
if (Encounter[5] == IN_PROGRESS)
|
||||
Encounter[5] = NOT_STARTED;
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> EncounterState[0] >> EncounterState[1] >> EncounterState[2] >> EncounterState[3]
|
||||
>> EncounterState[4] >> EncounterState[5];
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
// Do not reset 1, 2 and 3. they are not set to done, yet .
|
||||
if (EncounterState[0] == IN_PROGRESS)
|
||||
EncounterState[0] = NOT_STARTED;
|
||||
if (EncounterState[4] == IN_PROGRESS)
|
||||
EncounterState[4] = NOT_STARTED;
|
||||
if (EncounterState[5] == IN_PROGRESS)
|
||||
EncounterState[5] = NOT_STARTED;
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case TYPE_SH_QUEST:
|
||||
if (IsSilverHandDead[0] && IsSilverHandDead[1] && IsSilverHandDead[2] && IsSilverHandDead[3] && IsSilverHandDead[4])
|
||||
return 1;
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case TYPE_SH_QUEST:
|
||||
if (IsSilverHandDead[0] && IsSilverHandDead[1] && IsSilverHandDead[2] && IsSilverHandDead[3] && IsSilverHandDead[4])
|
||||
return 1;
|
||||
return 0;
|
||||
case TYPE_BARON_RUN:
|
||||
return EncounterState[0];
|
||||
case TYPE_BARONESS:
|
||||
return EncounterState[1];
|
||||
case TYPE_NERUB:
|
||||
return EncounterState[2];
|
||||
case TYPE_PALLID:
|
||||
return EncounterState[3];
|
||||
case TYPE_RAMSTEIN:
|
||||
return EncounterState[4];
|
||||
case TYPE_BARON:
|
||||
return EncounterState[5];
|
||||
}
|
||||
return 0;
|
||||
case TYPE_BARON_RUN:
|
||||
return Encounter[0];
|
||||
case TYPE_BARONESS:
|
||||
return Encounter[1];
|
||||
case TYPE_NERUB:
|
||||
return Encounter[2];
|
||||
case TYPE_PALLID:
|
||||
return Encounter[3];
|
||||
case TYPE_RAMSTEIN:
|
||||
return Encounter[4];
|
||||
case TYPE_BARON:
|
||||
return Encounter[5];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 data)
|
||||
{
|
||||
switch(data)
|
||||
{
|
||||
case DATA_BARON:
|
||||
return baronGUID;
|
||||
case DATA_YSIDA_TRIGGER:
|
||||
return ysidaTriggerGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
if (BaronRun_Timer)
|
||||
{
|
||||
if (BaronRun_Timer <= diff)
|
||||
{
|
||||
if (GetData(TYPE_BARON_RUN) != DONE)
|
||||
SetData(TYPE_BARON_RUN, FAIL);
|
||||
BaronRun_Timer = 0;
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Baron run event reached end. Event has state %u.",GetData(TYPE_BARON_RUN));
|
||||
} else BaronRun_Timer -= diff;
|
||||
}
|
||||
|
||||
if (SlaugtherSquare_Timer)
|
||||
uint64 GetData64(uint32 data)
|
||||
{
|
||||
if (SlaugtherSquare_Timer <= diff)
|
||||
switch (data)
|
||||
{
|
||||
if (Creature* pBaron = instance->GetCreature(baronGUID))
|
||||
case DATA_BARON:
|
||||
return baronGUID;
|
||||
case DATA_YSIDA_TRIGGER:
|
||||
return ysidaTriggerGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Update(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
pBaron->SummonCreature(C_BLACK_GUARD,4032.84f,-3390.24f,119.73f,4.71f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,1800000);
|
||||
case EVENT_BARON_RUN:
|
||||
if (GetData(TYPE_BARON_RUN) != DONE)
|
||||
SetData(TYPE_BARON_RUN, FAIL);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Baron run event reached end. Event has state %u.", GetData(TYPE_BARON_RUN));
|
||||
break;
|
||||
case EVENT_SLAUGHTER_SQUARE:
|
||||
if (Creature* baron = instance->GetCreature(baronGUID))
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
baron->SummonCreature(C_BLACK_GUARD, 4032.84f, -3390.24f, 119.73f, 4.71f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 1800000);
|
||||
|
||||
HandleGameObject(ziggurat4GUID, true);
|
||||
HandleGameObject(ziggurat5GUID, true);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Black guard sentries spawned. Opening gates to baron.");
|
||||
HandleGameObject(ziggurat4GUID, true);
|
||||
HandleGameObject(ziggurat5GUID, true);
|
||||
sLog->outDebug("TSCR: Instance Stratholme: Black guard sentries spawned. Opening gates to baron.");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
SlaugtherSquare_Timer = 0;
|
||||
} else SlaugtherSquare_Timer -= diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_stratholme_InstanceMapScript(map);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user