diff options
| author | megamage <none@none> | 2009-05-09 14:08:42 -0500 |
|---|---|---|
| committer | megamage <none@none> | 2009-05-09 14:08:42 -0500 |
| commit | 36a3696f350a244e84ccad642b3c98335dc088c2 (patch) | |
| tree | cc195763d92e300c2f059dea548d68edfe27a600 /src | |
| parent | 08a0c543d1bde434a2d994ae3ab71035343c8039 (diff) | |
*Update instance script functions.
--HG--
branch : trunk
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/InstanceData.cpp | 104 | ||||
| -rw-r--r-- | src/game/InstanceData.h | 41 |
2 files changed, 86 insertions, 59 deletions
diff --git a/src/game/InstanceData.cpp b/src/game/InstanceData.cpp index 92e4b4afe3d..80e728f7b3c 100644 --- a/src/game/InstanceData.cpp +++ b/src/game/InstanceData.cpp @@ -57,42 +57,66 @@ void InstanceData::OnCreatureCreate(Creature *creature, bool add) 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))); + + ++data; + } + sLog.outDebug("InstanceData::LoadDoorData: %u doors loaded.", doors.size()); +} + +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) { - BossInfo *bossInfo = &bosses[id]; - bossInfo->roomDoor.insert(door); - // Room door is only closed when encounter is in progress - if(bossInfo->state == IN_PROGRESS) - door->SetGoState(GO_STATE_READY); - else - door->SetGoState(GO_STATE_ACTIVE); + 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); } + + door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY); } -void InstanceData::SetBossPassageDoor(uint32 id, GameObject *door, bool add) +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) - { - 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 - door->SetGoState(GO_STATE_READY); - } + itr->second.bossInfo->door[itr->second.type].insert(door); else - bosses[id].passageDoor.erase(door); + itr->second.bossInfo->door[itr->second.type].erase(door); } + + if(add) + UpdateDoorState(door); } void InstanceData::SetBossState(uint32 id, EncounterState state) @@ -100,33 +124,13 @@ void InstanceData::SetBossState(uint32 id, EncounterState state) if(id < bosses.size()) { BossInfo *bossInfo = &bosses[id]; + if(bossInfo->state == state) + return; + bossInfo->state = state; - switch(state) - { - case NOT_STARTED: - // 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; - } + for(uint32 type = 0; type < MAX_DOOR_TYPES; ++type) + for(DoorSet::iterator i = bossInfo->door[type].begin(); i != bossInfo->door[type].end(); ++i) + UpdateDoorState(*i); } } diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 2d7e5f84746..d68cb7ff7f8 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -42,11 +42,34 @@ enum EncounterState typedef std::set<GameObject*> DoorSet; +enum DoorType +{ + DOOR_TYPE_ROOM = 0, + DOOR_TYPE_PASSAGE, + MAX_DOOR_TYPES, +}; + struct BossInfo { BossInfo() : state(NOT_STARTED) {} 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 @@ -80,15 +103,10 @@ class TRINITY_DLL_SPEC InstanceData virtual void OnPlayerEnter(Player *) {} //Called when a gameobject is created - virtual void OnObjectCreate(GameObject *go, bool add) - { - OnObjectCreate(go); - } - virtual void OnObjectCreate(GameObject *) {} + virtual void OnObjectCreate(GameObject *go, bool add) { OnObjectCreate(go); } //called on creature creation virtual void OnCreatureCreate(Creature *, bool add); - virtual void OnCreatureCreate(Creature *, uint32 entry) {} //All-purpose data storage 64 bit virtual uint64 GetData64(uint32 /*Data*/) { return 0; } @@ -105,9 +123,11 @@ class TRINITY_DLL_SPEC InstanceData void SetBossState(uint32 id, EncounterState state); protected: + void LoadDoorData(const DoorData *data); + void SetBossNumber(uint32 number) { bosses.resize(number); } - void SetBossRoomDoor(uint32 id, GameObject *door, bool add); - void SetBossPassageDoor(uint32 id, GameObject *door, bool add); + void AddDoor(GameObject *door, bool add); + void UpdateDoorState(GameObject *door); std::string GetBossSave() { @@ -119,7 +139,10 @@ class TRINITY_DLL_SPEC InstanceData private: std::vector<BossInfo> bosses; + DoorInfoMap doors; + virtual void OnObjectCreate(GameObject *) {} + virtual void OnCreatureCreate(Creature *, uint32 entry) {} }; #endif |
