*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
+56 -52
View File
@@ -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)
{
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);
}
else
bosses[id].roomDoor.erase(door);
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::SetBossPassageDoor(uint32 id, GameObject *door, bool add)
void InstanceData::UpdateDoorState(GameObject *door)
{
if(id < bosses.size())
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;
}
}
}
door->SetGoState(open ? GO_STATE_ACTIVE : GO_STATE_READY);
}
void InstanceData::AddDoor(GameObject *door, bool add)
{
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);
}
}
+32 -9
View File
@@ -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