diff options
Diffstat (limited to 'src/game/InstanceData.h')
-rw-r--r-- | src/game/InstanceData.h | 125 |
1 files changed, 90 insertions, 35 deletions
diff --git a/src/game/InstanceData.h b/src/game/InstanceData.h index 2f2b0c49be0..f3d45cc0cf6 100644 --- a/src/game/InstanceData.h +++ b/src/game/InstanceData.h @@ -1,7 +1,7 @@ /* - * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> * - * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> + * Copyright (C) 2008-2009 Trinity <http://www.trinitycore.org/> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,9 +21,9 @@ #ifndef TRINITY_INSTANCE_DATA_H #define TRINITY_INSTANCE_DATA_H -#include "Common.h" -#include "GameObject.h" -#include "Map.h" +#include "ZoneScript.h" +//#include "GameObject.h" +//#include "Map.h" class Map; class Unit; @@ -31,25 +31,85 @@ class Player; class GameObject; class Creature; +typedef std::set<GameObject*> DoorSet; +typedef std::set<Creature*> MinionSet; + enum EncounterState { NOT_STARTED = 0, IN_PROGRESS = 1, FAIL = 2, DONE = 3, - SPECIAL = 4 + SPECIAL = 4, + TO_BE_DECIDED = 5, }; -typedef std::set<GameObject*> DoorSet; +enum DoorType +{ + DOOR_TYPE_ROOM = 0, + DOOR_TYPE_PASSAGE, + MAX_DOOR_TYPES, +}; + +enum BoundaryType +{ + BOUNDARY_NONE = 0, + BOUNDARY_N, + BOUNDARY_S, + BOUNDARY_E, + BOUNDARY_W, + BOUNDARY_NE, + BOUNDARY_NW, + BOUNDARY_SE, + BOUNDARY_SW, + BOUNDARY_MAX_X = BOUNDARY_N, + BOUNDARY_MIN_X = BOUNDARY_S, + BOUNDARY_MAX_Y = BOUNDARY_W, + BOUNDARY_MIN_Y = BOUNDARY_E, +}; + +typedef std::map<BoundaryType, float> BossBoundaryMap; + +struct DoorData +{ + uint32 entry, bossId; + DoorType type; + uint32 boundary; +}; + +struct MinionData +{ + uint32 entry, bossId; +}; struct BossInfo { - BossInfo() : state(NOT_STARTED) {} + BossInfo() : state(TO_BE_DECIDED) {} EncounterState state; - DoorSet roomDoor, passageDoor; + DoorSet door[MAX_DOOR_TYPES]; + MinionSet minion; + BossBoundaryMap boundary; }; -class TRINITY_DLL_SPEC InstanceData +struct DoorInfo +{ + explicit DoorInfo(BossInfo *_bossInfo, DoorType _type, BoundaryType _boundary) + : bossInfo(_bossInfo), type(_type), boundary(_boundary) {} + BossInfo *bossInfo; + DoorType type; + BoundaryType boundary; +}; + +struct MinionInfo +{ + explicit MinionInfo(BossInfo *_bossInfo) : bossInfo(_bossInfo) {} + BossInfo *bossInfo; +}; + +typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap; +typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap; + +class TRINITY_DLL_SPEC InstanceData : public ZoneScript { public: @@ -62,15 +122,14 @@ class TRINITY_DLL_SPEC InstanceData virtual void Initialize() {} //On load - virtual void Load(const char* /*data*/) {} + virtual void Load(const char * data) { LoadBossState(data); } //When save is needed, this function generates the data - virtual const char* Save() { return ""; } + virtual std::string GetSaveData() { return GetBossSaveData(); } void SaveToDB(); - //Called every map update - virtual void Update(uint32 /*diff*/) {} + virtual void Update(uint32 diff) {} //Used by the map's CanEnter function. //This is to prevent players from entering during boss encounters. @@ -80,42 +139,38 @@ class TRINITY_DLL_SPEC InstanceData virtual void OnPlayerEnter(Player *) {} //Called when a gameobject is created - virtual void OnObjectCreate(GameObject *) {} + void OnGameObjectCreate(GameObject *go, bool add) { OnObjectCreate(go); } //called on creature creation - virtual void OnCreatureCreate(Creature * /*creature*/, uint32 /*creature_entry*/) {} - - virtual void OnCreatureRemove(Creature*) {} - virtual void OnObjectRemove(GameObject*) {} - - //All-purpose data storage 32 bit - virtual uint32 GetData(uint32) { return 0; } - virtual void SetData(uint32, uint32 data) {} + void OnCreatureCreate(Creature *, bool add); //Handle open / close objects //use HandleGameObject(NULL,boolen,GO); in OnObjectCreate in instance scripts //use HandleGameObject(GUID,boolen,NULL); in any other script void HandleGameObject(uint64 GUID, bool open, GameObject *go = NULL); + virtual bool SetBossState(uint32 id, EncounterState state); + const BossBoundaryMap * GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; } protected: - void AddBossRoomDoor(uint32 id, GameObject *door); - void AddBossPassageDoor(uint32 id, GameObject *door); - void RemoveBossRoomDoor(uint32 id, GameObject *door); - void RemoveBossPassageDoor(uint32 id, GameObject *door); + void SetBossNumber(uint32 number) { bosses.resize(number); } + void LoadDoorData(const DoorData *data); + void LoadMinionData(const MinionData *data); - void SetBossState(uint32 id, EncounterState state); + void AddDoor(GameObject *door, bool add); + void AddMinion(Creature *minion, bool add); - std::string GetBossSave() - { - std::ostringstream saveStream; - for(std::vector<BossInfo>::iterator i = bosses.begin(); i != bosses.end(); ++i) - saveStream << (uint32)i->state << " "; - return saveStream.str(); - } + void UpdateDoorState(GameObject *door); + void UpdateMinionState(Creature *minion, EncounterState state); + std::string LoadBossState(const char * data); + std::string GetBossSaveData(); private: std::vector<BossInfo> bosses; + DoorInfoMap doors; + MinionInfoMap minions; + virtual void OnObjectCreate(GameObject *) {} + virtual void OnCreatureCreate(Creature *, uint32 entry) {} }; #endif |