18#ifndef TRINITY_INSTANCE_DATA_H
19#define TRINITY_INSTANCE_DATA_H
30#ifdef TRINITY_API_USE_DYNAMIC_LINKING
34#define OUT_SAVE_INST_DATA TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance {} (Map {}, Instance Id {})", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
35#define OUT_SAVE_INST_DATA_COMPLETE TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance {} (Map {}, Instance Id {}) completed.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
36#define OUT_LOAD_INST_DATA(a) TC_LOG_DEBUG("scripts", "Loading Instance Data for Instance {} (Map {}, Instance Id {}). Input is '{}'", instance->GetMapName(), instance->GetId(), instance->GetInstanceId(), a)
37#define OUT_LOAD_INST_DATA_COMPLETE TC_LOG_DEBUG("scripts", "Instance Data Load for Instance {} (Map {}, Instance Id: {}) is complete.", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
38#define OUT_LOAD_INST_DATA_FAIL TC_LOG_ERROR("scripts", "Unable to load Instance Data for Instance {} (Map {}, Instance Id: {}).", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
199 virtual void Create();
201 void Load(
char const* data);
204 std::string GetSaveData();
209 virtual Optional<uint32> ComputeEntranceLocationForCompletedEncounters(
uint32 completedEncountersMask)
const;
212 void UpdateCombatResurrection(
uint32 diff);
216 virtual bool IsEncounterInProgress()
const;
220 virtual void OnCreatureCreate(
Creature* creature)
override;
221 virtual void OnCreatureRemove(
Creature* creature)
override;
223 virtual void OnGameObjectCreate(
GameObject* go)
override;
224 virtual void OnGameObjectRemove(
GameObject* go)
override;
247 void DoUseDoorOrButton(
ObjectGuid guid,
uint32 withRestoreTime = 0,
bool useAlternativeState =
false);
254 void DoUpdateWorldState(
int32 worldStateId,
int32 value);
257 void DoSendNotifyToInstance(
char const* format, ...);
263 void DoRemoveAurasDueToSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
264 void DoRemoveAurasDueToSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
267 void DoCastSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
268 void DoCastSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
271 static bool ServerAllowsTwoSideGroups();
275 static char const* GetBossStateName(
uint8 state);
288 void UpdateEncounterStateForKilledCreature(
uint32 creatureId,
Unit* source);
289 void UpdateEncounterStateForSpellCast(
uint32 spellId,
Unit* source);
292 void SetCompletedEncountersMask(
uint32 newMask);
297 bool IsEncounterCompleted(
uint32 dungeonEncounterId)
const;
298 bool IsEncounterCompletedInMaskByBossId(
uint32 completedEncountersMask,
uint32 bossId)
const;
303 void SetEntranceLocation(
uint32 worldSafeLocationId);
316 void SendEncounterUnit(
uint32 type,
Unit* unit =
nullptr,
uint8 priority = 0);
317 void SendEncounterStart(
uint32 inCombatResCount = 0,
uint32 maxInCombatResCount = 0,
uint32 inCombatResChargeRecovery = 0,
uint32 nextCombatResChargeTime = 0);
318 void SendEncounterEnd();
320 void SendBossKillCredit(
uint32 encounterId);
323 void UpdatePhasing();
325 void InitializeCombatResurrections(
uint8 charges = 1,
uint32 interval = 0);
326 void AddCombatResurrectionCharge();
327 void UseCombatResurrection();
328 void ResetCombatResurrections();
330 uint32 GetCombatResurrectionChargeInterval()
const;
333 std::string
const&
GetHeader()
const {
return headers; }
337 void SetHeaders(std::string
const& dataHeaders);
340 void LoadDoorData(
DoorData const* data);
347 LoadDungeonEncounterData(encounter.BossId, encounter.DungeonEncounterId);
350 void AddObject(
Creature* obj,
bool add);
354 virtual void AddDoor(
GameObject* door,
bool add);
355 void AddMinion(
Creature* minion,
bool add);
357 virtual void UpdateDoorState(
GameObject* door);
360 void UpdateSpawnGroups();
369 bool _SkipCheckRequiredBosses(
Player const* player =
nullptr)
const;
373 void LoadDungeonEncounterData(
uint32 bossId, std::array<uint32, MAX_DUNGEON_ENCOUNTERS_PER_BOSS>
const& dungeonEncounterIds);
393 #ifdef TRINITY_API_USE_DYNAMIC_LINKING
395 std::shared_ptr<ModuleReference> module_reference;
418 _value.emplace<
int64>(value);
423 _value.emplace<
double>(value);
427 void NotifyValueChanged();
445 return std::visit([](
auto v) {
return static_cast<T
>(v); },
_value);
463 if constexpr (std::is_integral_v<T> || std::is_enum_v<T>)
465 else if constexpr (std::is_floating_point_v<T>)
466 return double(value);
std::chrono::seconds Seconds
Seconds shorthand typedef.
static constexpr uint32 MAX_DUNGEON_ENCOUNTERS_PER_BOSS
@ ENCOUNTER_FRAME_RESET_COMBAT_RES_LIMIT
@ ENCOUNTER_FRAME_ENABLE_OBJECTIVE
@ ENCOUNTER_FRAME_SET_COMBAT_RES_LIMIT
@ 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
std::map< uint32, MinionInfo > MinionInfoMap
std::map< uint32, ObjectGuid > ObjectGuidMap
std::vector< AreaBoundary const * > CreatureBoundary
std::multimap< uint32, DoorInfo > DoorInfoMap
std::map< uint32, uint32 > ObjectInfoMap
std::pair< DoorInfoMap::const_iterator, DoorInfoMap::const_iterator > DoorInfoMapBounds
std::set< ObjectGuid > GuidSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
uint32 GetEntranceLocation() const
uint32 GetCompletedEncounterMask() const
void SetBossNumber(uint32 number)
uint8 GetCombatResurrectionCharges() const
std::vector< PersistentInstanceScriptValueBase * > _persistentScriptValues
void LoadDungeonEncounterData(T const &encounters)
uint32 _combatResurrectionTimer
std::vector< PersistentInstanceScriptValueBase * > & GetPersistentScriptValues()
bool IsAreaTriggerDone(uint32 id) const
uint32 completedEncounters
InstanceScript & operator=(InstanceScript &&right)=delete
ObjectGuidMap _objectGuids
InstanceScript(InstanceScript &&right)=delete
CreatureBoundary const * GetBossBoundary(uint32 id) const
void SetTemporaryEntranceLocation(uint32 worldSafeLocationId)
std::string const & GetHeader() const
ObjectInfoMap _gameObjectInfo
EncounterState GetBossState(uint32 id) const
virtual void OnPlayerLeave(Player *)
uint32 _temporaryEntranceId
InstanceScript(InstanceScript const &right)=delete
ObjectInfoMap _creatureInfo
bool _combatResurrectionTimerStarted
void RegisterPersistentScriptValue(PersistentInstanceScriptValueBase *value)
InstanceScript & operator=(InstanceScript const &right)=delete
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
std::unordered_set< uint32 > _activatedAreaTriggers
std::vector< BossInfo > bosses
virtual void OnPlayerEnter(Player *)
virtual void AfterDataLoad()
void MarkAreaTriggerDone(uint32 id)
uint32 GetEncounterCount() const
uint8 _combatResurrectionCharges
virtual void Update(uint32)
std::vector< InstanceSpawnGroupInfo > const *const _instanceSpawnGroups
void ResetAreaTriggerDone(uint32 id)
std::variant< int64, double > _value
char const * GetName() const
InstanceScript & _instance
void NotifyValueChanged()
void LoadValue(int64 value)
virtual ~PersistentInstanceScriptValueBase()
UpdateAdditionalSaveDataEvent CreateEvent() const
void LoadValue(double value)
PersistentInstanceScriptValue(InstanceScript &instance, char const *name, T value={})
PersistentInstanceScriptValue & operator=(T value)
static std::variant< int64, double > WrapValue(T value)
ObjectData const creatureData[]
DungeonEncounterData const encounters[]
ObjectData const gameObjectData[]
const_iterator begin() const
BossBoundaryData(std::initializer_list< BossBoundaryEntry > data)
std::vector< BossBoundaryEntry > StorageType
const_iterator end() const
StorageType::const_iterator const_iterator
AreaBoundary const * Boundary
GuidSet door[MAX_DOOR_TYPES]
DungeonEncounterEntry const * GetDungeonEncounterForDifficulty(Difficulty difficulty) const
std::array< DungeonEncounterEntry const *, MAX_DUNGEON_ENCOUNTERS_PER_BOSS > DungeonEncounters
CreatureBoundary boundary
DoorInfo(BossInfo *_bossInfo, DoorType _type)
std::array< uint32, MAX_DUNGEON_ENCOUNTERS_PER_BOSS > DungeonEncounterId
MinionInfo(BossInfo *_bossInfo)
std::variant< int64, double > Value
UpdateAdditionalSaveDataEvent(char const *key, std::variant< int64, double > value)
DungeonEncounterEntry const * DungeonEncounter