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())
198 void Load(
char const* data);
201 std::string GetSaveData();
206 virtual Optional<uint32> ComputeEntranceLocationForCompletedEncounters(
uint32 completedEncountersMask)
const;
209 void UpdateCombatResurrection(
uint32 diff);
213 virtual bool IsEncounterInProgress()
const;
217 virtual void OnCreatureCreate(
Creature* creature)
override;
218 virtual void OnCreatureRemove(
Creature* creature)
override;
220 virtual void OnGameObjectCreate(
GameObject* go)
override;
221 virtual void OnGameObjectRemove(
GameObject* go)
override;
244 void DoUseDoorOrButton(
ObjectGuid guid,
uint32 withRestoreTime = 0,
bool useAlternativeState =
false);
251 void DoUpdateWorldState(
int32 worldStateId,
int32 value);
254 void DoSendNotifyToInstance(
char const* format, ...);
260 void DoRemoveAurasDueToSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
261 void DoRemoveAurasDueToSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
264 void DoCastSpellOnPlayers(
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
265 void DoCastSpellOnPlayer(
Player* player,
uint32 spell,
bool includePets =
false,
bool includeControlled =
false);
268 static bool ServerAllowsTwoSideGroups();
272 static char const* GetBossStateName(
uint8 state);
284 bool IsEncounterCompleted(
uint32 dungeonEncounterId)
const;
285 bool IsEncounterCompletedInMaskByBossId(
uint32 completedEncountersMask,
uint32 bossId)
const;
290 void SetEntranceLocation(
uint32 worldSafeLocationId);
304 void SendEncounterStart(
uint32 inCombatResCount = 0,
uint32 maxInCombatResCount = 0,
uint32 inCombatResChargeRecovery = 0,
uint32 nextCombatResChargeTime = 0);
305 void SendEncounterEnd();
307 void SendBossKillCredit(
uint32 encounterId);
310 void UpdatePhasing();
312 void InitializeCombatResurrections(
uint8 charges = 1,
uint32 interval = 0);
313 void AddCombatResurrectionCharge();
314 void UseCombatResurrection();
315 void ResetCombatResurrections();
317 uint32 GetCombatResurrectionChargeInterval()
const;
320 std::string
const&
GetHeader()
const {
return headers; }
324 void SetHeaders(std::string
const& dataHeaders);
327 void LoadDoorData(
DoorData const* data);
334 LoadDungeonEncounterData(encounter.BossId, encounter.DungeonEncounterId);
341 virtual void AddDoor(
GameObject* door,
bool add);
342 void AddMinion(
Creature* minion,
bool add);
344 virtual void UpdateDoorState(
GameObject* door);
347 void UpdateSpawnGroups();
356 bool _SkipCheckRequiredBosses(
Player const* player =
nullptr)
const;
360 void LoadDungeonEncounterData(
uint32 bossId, std::array<uint32, MAX_DUNGEON_ENCOUNTERS_PER_BOSS>
const& dungeonEncounterIds);
361 void UpdateLfgEncounterState(
BossInfo const* bossInfo);
379 #ifdef TRINITY_API_USE_DYNAMIC_LINKING
381 std::shared_ptr<ModuleReference> module_reference;
404 _value.emplace<
int64>(value);
409 _value.emplace<
double>(value);
413 void NotifyValueChanged();
431 return std::visit([](
auto v) {
return static_cast<T
>(v); },
_value);
449 if constexpr (std::is_integral_v<T> || std::is_enum_v<T>)
451 else if constexpr (std::is_floating_point_v<T>)
452 return double(value);
std::vector< AreaBoundary const * > CreatureBoundary
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
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
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)
PersistentInstanceScriptValueBase(InstanceScript &instance, char const *name, std::variant< int64, double > 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[]
void AddObject(T *object)
TC_GAME_API GameObject * GetGameObject(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
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