diff options
Diffstat (limited to 'src/server/game/Instances/InstanceData.h')
-rw-r--r-- | src/server/game/Instances/InstanceData.h | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/src/server/game/Instances/InstanceData.h b/src/server/game/Instances/InstanceData.h new file mode 100644 index 00000000000..eb2c781aa91 --- /dev/null +++ b/src/server/game/Instances/InstanceData.h @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> + * + * Copyright (C) 2008-2010 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef TRINITY_INSTANCE_DATA_H +#define TRINITY_INSTANCE_DATA_H + +#include "ZoneScript.h" +#include "World.h" +//#include "GameObject.h" +//#include "Map.h" + +class Map; +class Unit; +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, + TO_BE_DECIDED = 5, +}; + +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(TO_BE_DECIDED) {} + EncounterState state; + DoorSet door[MAX_DOOR_TYPES]; + MinionSet minion; + BossBoundaryMap boundary; +}; + +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 InstanceData : public ZoneScript +{ + public: + + explicit InstanceData(Map *map) : instance(map) {} + virtual ~InstanceData() {} + + Map *instance; + + //On creation, NOT load. + virtual void Initialize() {} + + //On load + virtual void Load(const char * data) { LoadBossState(data); } + + //When save is needed, this function generates the data + virtual std::string GetSaveData() { return GetBossSaveData(); } + + void SaveToDB(); + + virtual void Update(uint32 /*diff*/) {} + + //Used by the map's CanEnter function. + //This is to prevent players from entering during boss encounters. + virtual bool IsEncounterInProgress() const; + + //Called when a player successfully enters the instance. + virtual void OnPlayerEnter(Player *) {} + + //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); + + //change active state of doors or buttons + void DoUseDoorOrButton(uint64 uiGuid, uint32 uiWithRestoreTime = 0, bool bUseAlternativeState = false); + + //Respawns a GO having negative spawntimesecs in gameobject-table + void DoRespawnGameObject(uint64 uiGuid, uint32 uiTimeToDespawn = MINUTE); + + //sends world state update to all players in instance + void DoUpdateWorldState(uint32 uiStateId, uint32 uiStateData); + + // Send Notify to all players in instance + void DoSendNotifyToInstance(const char *format,...); + + // Complete Achievement for all players in instance + void DoCompleteAchievement(uint32 achievement); + + // Update Achievement Criteria for all players in instance + void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0); + + // Start/Stop Timed Achievement Criteria for all players in instance + void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); + void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); + + // Remove Auras due to Spell on all players in instance + void DoRemoveAurasDueToSpellOnPlayers(uint32 spell); + + // Return wether server allow two side groups or not + bool ServerAllowsTwoSideGroups() { return sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP); } + + virtual bool SetBossState(uint32 id, EncounterState state); + EncounterState GetBossState(uint32 id) const { return id < bosses.size() ? bosses[id].state : TO_BE_DECIDED; } + const BossBoundaryMap * GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; } + + // Achievement criteria additional requirements check + // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType + virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0); + protected: + void SetBossNumber(uint32 number) { bosses.resize(number); } + void LoadDoorData(const DoorData *data); + void LoadMinionData(const MinionData *data); + + void AddDoor(GameObject *door, bool add); + void AddMinion(Creature *minion, bool add); + + 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; +}; +#endif + |