*Update instance script functions.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-05-09 14:08:42 -05:00
parent 08a0c543d1
commit 36a3696f35
2 changed files with 88 additions and 61 deletions
+55 -51
View File
@@ -57,42 +57,66 @@ void InstanceData::OnCreatureCreate(Creature *creature, bool add)
OnCreatureCreate(creature, creature->GetEntry()); OnCreatureCreate(creature, creature->GetEntry());
} }
void InstanceData::SetBossRoomDoor(uint32 id, GameObject *door, bool add) void InstanceData::LoadDoorData(const DoorData *data)
{ {
if(id < bosses.size()) while(data->entry)
{ {
if(add) if(data->bossId < bosses.size())
{ doors.insert(std::make_pair(data->entry, DoorInfo(&bosses[data->bossId], data->type)));
BossInfo *bossInfo = &bosses[id];
bossInfo->roomDoor.insert(door); ++data;
// Room door is only closed when encounter is in progress }
if(bossInfo->state == IN_PROGRESS) sLog.outDebug("InstanceData::LoadDoorData: %u doors loaded.", doors.size());
door->SetGoState(GO_STATE_READY); }
else
door->SetGoState(GO_STATE_ACTIVE); void InstanceData::UpdateDoorState(GameObject *door)
{
DoorInfoMap::iterator lower = doors.lower_bound(door->GetEntry());
DoorInfoMap::iterator upper = doors.upper_bound(door->GetEntry());
if(lower == upper)
return;
bool open = true;
for(DoorInfoMap::iterator itr = lower; itr != upper; ++itr)
{
if(itr->second.type == DOOR_TYPE_ROOM)
{
if(itr->second.bossInfo->state == IN_PROGRESS)
{
open = false;
break;
}
}
else if(itr->second.type == DOOR_TYPE_PASSAGE)
{
if(itr->second.bossInfo->state != DONE)
{
open = false;
break;
} }
else
bosses[id].roomDoor.erase(door);
} }
} }
void InstanceData::SetBossPassageDoor(uint32 id, GameObject *door, bool add) door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY);
}
void InstanceData::AddDoor(GameObject *door, bool add)
{ {
if(id < bosses.size()) DoorInfoMap::iterator lower = doors.lower_bound(door->GetEntry());
DoorInfoMap::iterator upper = doors.upper_bound(door->GetEntry());
if(lower == upper)
return;
for(DoorInfoMap::iterator itr = lower; itr != upper; ++itr)
{ {
if(add) if(add)
{ itr->second.bossInfo->door[itr->second.type].insert(door);
BossInfo *bossInfo = &bosses[id];
bossInfo->passageDoor.insert(door);
// Passage door is only opened when boss is defeated
if(bossInfo->state == DONE)
door->SetGoState(GO_STATE_ACTIVE);
else else
door->SetGoState(GO_STATE_READY); itr->second.bossInfo->door[itr->second.type].erase(door);
}
else
bosses[id].passageDoor.erase(door);
} }
if(add)
UpdateDoorState(door);
} }
void InstanceData::SetBossState(uint32 id, EncounterState state) void InstanceData::SetBossState(uint32 id, EncounterState state)
@@ -100,33 +124,13 @@ void InstanceData::SetBossState(uint32 id, EncounterState state)
if(id < bosses.size()) if(id < bosses.size())
{ {
BossInfo *bossInfo = &bosses[id]; BossInfo *bossInfo = &bosses[id];
if(bossInfo->state == state)
return;
bossInfo->state = state; bossInfo->state = state;
switch(state) for(uint32 type = 0; type < MAX_DOOR_TYPES; ++type)
{ for(DoorSet::iterator i = bossInfo->door[type].begin(); i != bossInfo->door[type].end(); ++i)
case NOT_STARTED: UpdateDoorState(*i);
// Open all room doors, close all passage doors
for(DoorSet::iterator i = bossInfo->roomDoor.begin(); i != bossInfo->roomDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_ACTIVE);
for(DoorSet::iterator i = bossInfo->passageDoor.begin(); i != bossInfo->passageDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_READY);
break;
case IN_PROGRESS:
// Close all doors
for(DoorSet::iterator i = bossInfo->roomDoor.begin(); i != bossInfo->roomDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_READY);
for(DoorSet::iterator i = bossInfo->passageDoor.begin(); i != bossInfo->passageDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_READY);
break;
case DONE:
// Open all doors
for(DoorSet::iterator i = bossInfo->roomDoor.begin(); i != bossInfo->roomDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_ACTIVE);
for(DoorSet::iterator i = bossInfo->passageDoor.begin(); i != bossInfo->passageDoor.end(); ++i)
(*i)->SetGoState(GO_STATE_ACTIVE);
break;
default:
break;
}
} }
} }
+32 -9
View File
@@ -42,11 +42,34 @@ enum EncounterState
typedef std::set<GameObject*> DoorSet; typedef std::set<GameObject*> DoorSet;
enum DoorType
{
DOOR_TYPE_ROOM = 0,
DOOR_TYPE_PASSAGE,
MAX_DOOR_TYPES,
};
struct BossInfo struct BossInfo
{ {
BossInfo() : state(NOT_STARTED) {} BossInfo() : state(NOT_STARTED) {}
EncounterState state; EncounterState state;
DoorSet roomDoor, passageDoor; DoorSet door[MAX_DOOR_TYPES];
};
struct DoorInfo
{
explicit DoorInfo(BossInfo *_bossInfo, DoorType _type)
: bossInfo(_bossInfo), type(_type) {}
BossInfo *bossInfo;
DoorType type;
};
typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap;
struct DoorData
{
uint32 entry, bossId;
DoorType type;
}; };
class TRINITY_DLL_SPEC InstanceData class TRINITY_DLL_SPEC InstanceData
@@ -80,15 +103,10 @@ class TRINITY_DLL_SPEC InstanceData
virtual void OnPlayerEnter(Player *) {} virtual void OnPlayerEnter(Player *) {}
//Called when a gameobject is created //Called when a gameobject is created
virtual void OnObjectCreate(GameObject *go, bool add) virtual void OnObjectCreate(GameObject *go, bool add) { OnObjectCreate(go); }
{
OnObjectCreate(go);
}
virtual void OnObjectCreate(GameObject *) {}
//called on creature creation //called on creature creation
virtual void OnCreatureCreate(Creature *, bool add); virtual void OnCreatureCreate(Creature *, bool add);
virtual void OnCreatureCreate(Creature *, uint32 entry) {}
//All-purpose data storage 64 bit //All-purpose data storage 64 bit
virtual uint64 GetData64(uint32 /*Data*/) { return 0; } virtual uint64 GetData64(uint32 /*Data*/) { return 0; }
@@ -105,9 +123,11 @@ class TRINITY_DLL_SPEC InstanceData
void SetBossState(uint32 id, EncounterState state); void SetBossState(uint32 id, EncounterState state);
protected: protected:
void LoadDoorData(const DoorData *data);
void SetBossNumber(uint32 number) { bosses.resize(number); } void SetBossNumber(uint32 number) { bosses.resize(number); }
void SetBossRoomDoor(uint32 id, GameObject *door, bool add); void AddDoor(GameObject *door, bool add);
void SetBossPassageDoor(uint32 id, GameObject *door, bool add); void UpdateDoorState(GameObject *door);
std::string GetBossSave() std::string GetBossSave()
{ {
@@ -119,7 +139,10 @@ class TRINITY_DLL_SPEC InstanceData
private: private:
std::vector<BossInfo> bosses; std::vector<BossInfo> bosses;
DoorInfoMap doors;
virtual void OnObjectCreate(GameObject *) {}
virtual void OnCreatureCreate(Creature *, uint32 entry) {}
}; };
#endif #endif