18#ifndef TRINITY_INSTANCE_DATA_H
19#define TRINITY_INSTANCE_DATA_H
31#ifdef TRINITY_API_USE_DYNAMIC_LINKING
35#define OUT_SAVE_INST_DATA TC_LOG_DEBUG("scripts", "Saving Instance Data for Instance {} (Map {}, Instance Id {})", instance->GetMapName(), instance->GetId(), instance->GetInstanceId())
36#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())
37#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)
38#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())
39#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())
142 std::array<DungeonEncounterEntry const*, MAX_DUNGEON_ENCOUNTERS_PER_BOSS>
DungeonEncounters = { };
195 virtual void Create();
197 void Load(
char const* data);
200 std::string GetSaveData();
205 virtual Optional<uint32> ComputeEntranceLocationForCompletedEncounters(
uint32 completedEncountersMask)
const;
208 void UpdateCombatResurrection(
uint32 diff);
212 virtual bool IsEncounterInProgress()
const;
216 virtual void OnCreatureCreate(
Creature* creature)
override;
217 virtual void OnCreatureRemove(
Creature* creature)
override;
219 virtual void OnGameObjectCreate(
GameObject* go)
override;
220 virtual void OnGameObjectRemove(
GameObject* go)
override;
243 void DoUseDoorOrButton(
ObjectGuid guid,
uint32 withRestoreTime = 0,
bool useAlternativeState =
false);
250 void DoUpdateWorldState(
int32 worldStateId,
int32 value);
253 void DoSendNotifyToInstance(
char const* format, ...);
259 void DoRemoveAurasDueToSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
260 void DoRemoveAurasDueToSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
263 void DoCastSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
264 void DoCastSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
267 static bool ServerAllowsTwoSideGroups();
271 static char const* GetBossStateName(
uint8 state);
283 bool IsEncounterCompleted(
uint32 dungeonEncounterId)
const;
284 bool IsEncounterCompletedInMaskByBossId(
uint32 completedEncountersMask,
uint32 bossId)
const;
289 void SetEntranceLocation(
uint32 worldSafeLocationId);
303 void SendEncounterStart(
uint32 inCombatResCount = 0,
uint32 maxInCombatResCount = 0,
uint32 inCombatResChargeRecovery = 0,
uint32 nextCombatResChargeTime = 0);
304 void SendEncounterEnd();
306 void SendBossKillCredit(
uint32 encounterId);
309 void UpdatePhasing();
311 void InitializeCombatResurrections(
uint8 charges = 1,
uint32 interval = 0);
312 void AddCombatResurrectionCharge();
313 void UseCombatResurrection();
314 void ResetCombatResurrections();
316 uint32 GetCombatResurrectionChargeInterval()
const;
319 std::string
const&
GetHeader()
const {
return headers; }
323 void SetHeaders(std::string_view dataHeaders);
324 void SetBossNumber(
uint32 number);
326 void LoadDoorData(std::span<DoorData const> data);
328 void LoadDungeonEncounterData(std::span<DungeonEncounterData const>
encounters);
329 void LoadMinionData(std::span<MinionData const> data);
331 void AddObject(
Creature* obj,
bool add);
335 virtual void AddDoor(
GameObject* door,
bool add);
336 void AddMinion(
Creature* minion,
bool add);
338 virtual void UpdateDoorState(
GameObject* door);
341 void UpdateSpawnGroups();
350 bool _SkipCheckRequiredBosses(
Player const* player =
nullptr)
const;
354 void LoadDungeonEncounterData(
uint32 bossId, std::array<uint32, MAX_DUNGEON_ENCOUNTERS_PER_BOSS>
const& dungeonEncounterIds);
355 void UpdateLfgEncounterState(
BossInfo const* bossInfo);
373 #ifdef TRINITY_API_USE_DYNAMIC_LINKING
375 std::shared_ptr<ModuleReference> module_reference;
398 _value.emplace<
int64>(value);
403 _value.emplace<
double>(value);
407 void NotifyValueChanged();
425 return std::visit([](
auto v) {
return static_cast<T
>(v); },
_value);
443 if constexpr (std::is_integral_v<T> || std::is_enum_v<T>)
445 else if constexpr (std::is_floating_point_v<T>)
446 return double(value);
std::chrono::seconds Seconds
Seconds shorthand typedef.
static constexpr uint32 MAX_DUNGEON_ENCOUNTERS_PER_BOSS
@ ENCOUNTER_FRAME_ENABLE_OBJECTIVE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_UPDATE_PRIORITY
@ ENCOUNTER_FRAME_DISABLE_OBJECTIVE
@ ENCOUNTER_FRAME_UPDATE_OBJECTIVE
@ ENCOUNTER_FRAME_ADD_TIMER
@ ENCOUNTER_FRAME_PHASE_SHIFT_CHANGED
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
uint8 GetCombatResurrectionCharges() const
std::vector< PersistentInstanceScriptValueBase * > _persistentScriptValues
uint32 _combatResurrectionTimer
std::vector< PersistentInstanceScriptValueBase * > & GetPersistentScriptValues()
bool IsAreaTriggerDone(uint32 id) const
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 ~InstanceScript()
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)
static constexpr ObjectData creatureData[]
static constexpr DungeonEncounterData encounters[]
static constexpr ObjectData 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
DungeonEncounterEntry const * GetDungeonEncounterForDifficulty(Difficulty difficulty) const
std::array< DungeonEncounterEntry const *, MAX_DUNGEON_ENCOUNTERS_PER_BOSS > DungeonEncounters
std::array< GuidSet, static_cast< uint8 >(EncounterDoorBehavior::Max)> door
CreatureBoundary boundary
EncounterDoorBehavior Behavior
DoorInfo(BossInfo *_bossInfo, EncounterDoorBehavior _behavior)
EncounterDoorBehavior Behavior
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