Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
InstanceScript.h
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#ifndef SKYFIRE_INSTANCE_DATA_H
7#define SKYFIRE_INSTANCE_DATA_H
8
9#include "ObjectMgr.h"
10#include "World.h"
11#include "WorldStateBuilder.h"
12#include "ZoneScript.h"
13
14#define OUT_SAVE_INST_DATA SF_LOG_DEBUG("scripts", "Saving Instance Data for Instance %s (Map %d, Instance Id %d)", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
15#define OUT_SAVE_INST_DATA_COMPLETE SF_LOG_DEBUG("scripts", "Saving Instance Data for Instance %s (Map %d, Instance Id %d) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
16#define OUT_LOAD_INST_DATA(a) SF_LOG_DEBUG("scripts", "Loading Instance Data for Instance %s (Map %d, Instance Id %d). Input is '%s'", instance->GetMapName(), instance->GetId(), instance->GetInstanceId(), a)
17#define OUT_LOAD_INST_DATA_COMPLETE SF_LOG_DEBUG("scripts", "Instance Data Load for Instance %s (Map %d, Instance Id: %d) is complete.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
18#define OUT_LOAD_INST_DATA_FAIL SF_LOG_ERROR("scripts", "Unable to load Instance Data for Instance %s (Map %d, Instance Id: %d).", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
19
20class Map;
21class Unit;
22class Player;
23class GameObject;
24class Creature;
25
26typedef std::set<GameObject*> DoorSet;
27typedef std::set<Creature*> MinionSet;
28
43
53
55{
56 DOOR_TYPE_ROOM = 0, // Door can open if encounter is not in progress
57 DOOR_TYPE_PASSAGE = 1, // Door can open if encounter is done
58 DOOR_TYPE_SPAWN_HOLE = 2, // Door can open if encounter is in progress, typically used for spawning places
60};
61
78
79typedef std::map<BoundaryType, float> BossBoundaryMap;
80
87
89{
91};
92
101
103{
104 explicit DoorInfo(BossInfo* _bossInfo, DoorType _type, BoundaryType _boundary)
105 : bossInfo(_bossInfo), type(_type), boundary(_boundary) { }
109};
110
112{
113 explicit MinionInfo(BossInfo* _bossInfo) : bossInfo(_bossInfo) { }
115};
116
117typedef std::multimap<uint32 /*entry*/, DoorInfo> DoorInfoMap;
118typedef std::pair<DoorInfoMap::const_iterator, DoorInfoMap::const_iterator> DoorInfoMapBounds;
119
120typedef std::map<uint32 /*entry*/, MinionInfo> MinionInfoMap;
121
123{
124public:
125 explicit InstanceScript(Map* map) : instance(map), completedEncounters(0) { }
126
127 virtual ~InstanceScript() { }
128
130
131 //On creation, NOT load.
132 virtual void Initialize() { }
133
134 //On load
135 virtual void Load(char const* data) { LoadBossState(data); }
136
137 //When save is needed, this function generates the data
138 virtual std::string GetSaveData() { return GetBossSaveData(); }
139
140 void SaveToDB();
141
142 virtual void Update(uint32 /*diff*/) { }
143
144 //Used by the map's CanEnter function.
145 //This is to prevent players from entering during boss encounters.
146 virtual bool IsEncounterInProgress() const;
147
148 //Called when a player successfully enters the instance.
149 virtual void OnPlayerEnter(Player* /*player*/) { }
150
151 //Handle open / close objects
152 //use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts
153 //use HandleGameObject(GUID, boolen, NULL); in any other script
154 void HandleGameObject(uint64 guid, bool open, GameObject* go = NULL);
155
156 //change active state of doors or buttons
157 void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime = 0, bool useAlternativeState = false);
158
159 //Respawns a GO having negative spawntimesecs in gameobject-table
160 void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn = MINUTE);
161
162 //sends world state update to all players in instance
163 void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue);
164
165 // Send Notify to all players in instance
166 void DoSendNotifyToInstance(char const* format, ...);
167
168 // Update Achievement Criteria for all players in instance
169 void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL);
170
171 // Start/Stop Timed Achievement Criteria for all players in instance
174
175 // Remove Auras due to Spell on all players in instance
177
178 // Cast spell on all players in instance
179 void DoCastSpellOnPlayers(uint32 spell);
180
181 // Return wether server allow two side groups or not
183
184 virtual bool SetBossState(uint32 id, EncounterState state);
185 EncounterState GetBossState(uint32 id) const { return id < bosses.size() ? bosses[id].state : TO_BE_DECIDED; }
186 BossBoundaryMap const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : NULL; }
187
188 // Achievement criteria additional requirements check
189 // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType
190 virtual bool CheckAchievementCriteriaMeet(uint32 /*criteria_id*/, Player const* /*source*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0);
191
192 // Checks boss requirements (one boss required to kill other)
193 virtual bool CheckRequiredBosses(uint32 /*bossId*/, Player const* /*player*/ = NULL) const { return true; }
194
195 // Checks encounter state at kill/spellcast
196 void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit* source);
197
198 // Used only during loading
200
201 // Returns completed encounters mask for packets
203
204 void SendEncounterUnit(uint32 type, Unit* unit = NULL, uint8 param1 = 0, uint8 param2 = 0);
205
206 virtual void FillInitialWorldStates(WorldStateBuilder& /*builder*/) { }
207
208 // ReCheck PhaseTemplate related conditions
209 void UpdatePhasing();
210
211protected:
212 void SetBossNumber(uint32 number) { bosses.resize(number); }
213 void LoadDoorData(DoorData const* data);
214 void LoadMinionData(MinionData const* data);
215
216 void AddDoor(GameObject* door, bool add);
217 void AddMinion(Creature* minion, bool add);
218
219 void UpdateDoorState(GameObject* door);
220 void UpdateMinionState(Creature* minion, EncounterState state);
221
222 void LoadBossState(char const* data);
223 std::string GetBossSaveData();
224private:
225 std::vector<BossInfo> bosses;
228 uint32 completedEncounters; // completed encounter mask, bit indexes are DungeonEncounter.dbc boss numbers, used for packets
229};
230
231template<class AI, class T>
232AI* GetInstanceAI(T* obj, char const* scriptName)
233{
234 if (InstanceMap* instance = obj->GetMap()->ToInstanceMap())
235 if (instance->GetInstanceScript())
236 if (instance->GetScriptId() == sObjectMgr->GetScriptId(scriptName))
237 return new AI(obj);
238
239 return NULL;
240}
241
242#endif // SKYFIRE_INSTANCE_DATA_H
@ MINUTE
Definition Common.h:119
AchievementCriteriaTimedTypes
Definition DBCEnums.h:157
AchievementCriteriaTypes
Definition DBCEnums.h:170
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint64_t uint64
Definition Define.h:76
std::set< GameObject * > DoorSet
EncounterState
@ IN_PROGRESS
@ FAIL
@ DONE
@ SPECIAL
@ NOT_STARTED
@ TO_BE_DECIDED
EncounterFrameType
@ ENCOUNTER_FRAME_RESET_COMBAT_RES_LIMIT
@ ENCOUNTER_FRAME_ENABLE_OBJECTIVE
@ ENCOUNTER_FRAME_SET_COMBAT_RES_LIMIT
@ ENCOUNTER_FRAME_UNK7
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ADD_COMBAT_RES_LIMIT
@ ENCOUNTER_FRAME_UPDATE_PRIORITY
@ ENCOUNTER_FRAME_DISABLE_OBJECTIVE
@ ENCOUNTER_FRAME_UPDATE_OBJECTIVE
@ ENCOUNTER_FRAME_ADD_TIMER
@ ENCOUNTER_FRAME_ENGAGE
std::map< uint32, MinionInfo > MinionInfoMap
AI * GetInstanceAI(T *obj, char const *scriptName)
std::multimap< uint32, DoorInfo > DoorInfoMap
std::map< BoundaryType, float > BossBoundaryMap
DoorType
@ DOOR_TYPE_SPAWN_HOLE
@ DOOR_TYPE_ROOM
@ DOOR_TYPE_PASSAGE
@ MAX_DOOR_TYPES
std::pair< DoorInfoMap::const_iterator, DoorInfoMap::const_iterator > DoorInfoMapBounds
std::set< Creature * > MinionSet
BoundaryType
@ BOUNDARY_MAX_X
@ BOUNDARY_NONE
@ BOUNDARY_SE
@ BOUNDARY_MIN_X
@ BOUNDARY_SW
@ BOUNDARY_NE
@ BOUNDARY_MIN_Y
@ BOUNDARY_W
@ BOUNDARY_NW
@ BOUNDARY_S
@ BOUNDARY_N
@ BOUNDARY_E
@ BOUNDARY_MAX_Y
EncounterCreditType
Definition ObjectMgr.h:638
#define sObjectMgr
Definition ObjectMgr.h:1617
InstanceScript(Map *map)
void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=NULL)
void UpdateMinionState(Creature *minion, EncounterState state)
uint32 GetCompletedEncounterMask() const
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void DoUseDoorOrButton(uint64 guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
MinionInfoMap minions
uint32 completedEncounters
bool ServerAllowsTwoSideGroups()
void DoCastSpellOnPlayers(uint32 spell)
void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit *source)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell)
std::string GetBossSaveData()
DoorInfoMap doors
void AddMinion(Creature *minion, bool add)
EncounterState GetBossState(uint32 id) const
virtual bool IsEncounterInProgress() const
virtual std::string GetSaveData()
void LoadBossState(char const *data)
void AddDoor(GameObject *door, bool add)
virtual bool CheckAchievementCriteriaMeet(uint32, Player const *, Unit const *=NULL, uint32=0)
void LoadMinionData(MinionData const *data)
void LoadDoorData(DoorData const *data)
virtual bool CheckRequiredBosses(uint32, Player const *=NULL) const
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
virtual ~InstanceScript()
std::vector< BossInfo > bosses
BossBoundaryMap const * GetBossBoundary(uint32 id) const
virtual void OnPlayerEnter(Player *)
virtual void Load(char const *data)
void SendEncounterUnit(uint32 type, Unit *unit=NULL, uint8 param1=0, uint8 param2=0)
virtual void Initialize()
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
void UpdateDoorState(GameObject *door)
void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn=MINUTE)
virtual void Update(uint32)
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void SetCompletedEncountersMask(uint32 newMask)
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
void DoSendNotifyToInstance(char const *format,...)
virtual void FillInitialWorldStates(WorldStateBuilder &)
Definition Map.h:238
InstanceMap * ToInstanceMap()
Definition Map.h:440
Definition Unit.h:1367
#define sWorld
Definition World.h:910
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition World.h:98
EncounterState state
DoorSet door[MAX_DOOR_TYPES]
BossBoundaryMap boundary
MinionSet minion
uint32 entry
uint32 boundary
DoorType type
uint32 bossId
BossInfo * bossInfo
BoundaryType boundary
DoorInfo(BossInfo *_bossInfo, DoorType _type, BoundaryType _boundary)
DoorType type
BossInfo * bossInfo
MinionInfo(BossInfo *_bossInfo)