47#ifdef TRINITY_API_USE_DYNAMIC_LINKING
61 return dungeonEncounter && (dungeonEncounter->DifficultyID == 0 || Difficulty(dungeonEncounter->DifficultyID) == difficulty);
68_entranceId(0), _temporaryEntranceId(0), _combatResurrectionTimer(0), _combatResurrectionCharges(0), _combatResurrectionTimerStarted(false)
70#ifdef TRINITY_API_USE_DYNAMIC_LINKING
72 auto const scriptname =
sObjectMgr->GetScriptName(scriptId);
73 ASSERT(!scriptname.empty());
76 module_reference =
sScriptMgr->AcquireModuleReferenceOfScriptName(scriptname);
86 for (std::vector<BossInfo>::const_iterator itr =
bosses.begin(); itr !=
bosses.end(); ++itr)
119 ObjectGuidMap::const_iterator i =
_objectGuids.find(type);
165 if (entry.BossId <
bosses.size())
166 bosses[entry.BossId].boundary.push_back(entry.Boundary);
208 ASSERT(objectInfo.find(data->
entry) == objectInfo.end());
216 if (bossId <
bosses.size())
224 if (range.first == range.second)
228 for (; range.first != range.second && open; ++range.first)
230 DoorInfo const& info = range.first->second;
278 enum states { BLOCK, SPAWN, FORCEBLOCK };
279 std::unordered_map<uint32, states> newStates;
284 if (curValue == FORCEBLOCK)
292 curValue = FORCEBLOCK;
296 for (
auto const& pair : newStates)
298 uint32 const groupId = pair.first;
299 bool const doSpawn = (pair.second == SPAWN);
345 if (range.first == range.second)
348 for (; range.first != range.second; ++range.first)
350 DoorInfo const& data = range.first->second;
369 itr->second.bossInfo->minion.insert(minion->
GetGUID());
371 itr->second.bossInfo->minion.erase(minion->
GetGUID());
381 bossInfo->
state = state;
387 if (bossInfo->
state == state)
397 for (GuidSet::iterator i = bossInfo->
minion.begin(); i != bossInfo->
minion.end(); ++i)
399 if (minion->isWorldBoss() && minion->IsAlive())
433 if (dungeonEncounter)
459 bossInfo->
state = state;
460 if (dungeonEncounter)
470 for (GuidSet::iterator i =
minions.begin(); i !=
minions.end(); ++i)
487 for (
size_t i = 0; i <
bosses.size(); ++i)
513 if (dungeonEncounter->CompleteWorldStateID)
581 TC_LOG_DEBUG(
"scripts",
"InstanceScript: HandleGameObject failed");
594 go->UseDoorOrButton(withRestoreTime, useAlternativeState);
596 go->ResetDoorOrButton();
599 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoUseDoorOrButton can't use gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
602 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoUseDoorOrButton failed");
615 go->ResetDoorOrButton();
618 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoCloseDoorOrButton can't use gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
621 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoCloseDoorOrButton failed");
628 switch (go->GetGoType())
635 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoRespawnGameObject can't respawn gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
644 go->SetRespawnTime(timeToDespawn.count());
647 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoRespawnGameObject failed");
659 va_start(ap, format);
661 vsnprintf(buff, 1024, format, ap);
666 player->
GetSession()->SendNotification(
"%s", buff);
702 summon->RemoveAurasDueToSpell(spell);
705 if (!includeControlled)
710 if (
Unit* controlled = *itr2)
711 if (controlled->IsInWorld() && controlled->GetTypeId() ==
TYPEID_UNIT)
712 controlled->RemoveAurasDueToSpell(spell);
739 summon->CastSpell(player, spell,
true);
742 if (!includeControlled)
747 if (
Unit* controlled = *itr2)
748 if (controlled->IsInWorld() && controlled->GetTypeId() ==
TYPEID_UNIT)
749 controlled->CastSpell(player, spell,
true);
773 TC_LOG_ERROR(
"misc",
"Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map {} not have implementation for achievement criteria {}",
780 for (std::size_t i = 0; i <
bosses.size(); ++i)
781 for (std::size_t j = 0; j <
bosses[i].DungeonEncounters.size(); ++j)
782 if (
bosses[i].DungeonEncounters[j] &&
bosses[i].DungeonEncounters[j]->ID == dungeonEncounterId)
791 if (completedEncountersMask & (1 << dungeonEncounter->Bit))
834 encounterChangePriorityMessage.
Unit = unit->
GetGUID();
842 instanceEncounterTimerStart.
TimeRemaining = param1.value_or(0);
849 instanceEncounterObjectiveStart.
ObjectiveID = param1.value_or(0);
856 instanceEncounterObjectiveUpdate.
ObjectiveID = param1.value_or(0);
857 instanceEncounterObjectiveUpdate.
ProgressAmount = param2.value_or(0);
864 instanceEncounterObjectiveComplete.
ObjectiveID = param1.value_or(0);
908 if (
Player* player = ref.GetSource())
910 if (
Group* grp = player->GetGroup())
912 if (grp->isLFGGroup())
914 std::array<uint32, MAX_DUNGEON_ENCOUNTERS_PER_BOSS> dungeonEncounterIds;
917 sLFGMgr->OnDungeonEncounterDone(grp->GetGUID(), dungeonEncounterIds,
instance);
994 : _instance(instance), _name(name), _value(
std::move(value))
1009 return instance->GetScriptName() == scriptName;
DB2Storage< DungeonEncounterEntry > sDungeonEncounterStore("DungeonEncounter.db2", &DungeonEncounterLoadInfo::Instance)
@ DefeatDungeonEncounterWhileElegibleForLoot
std::chrono::seconds Seconds
Seconds shorthand typedef.
bool InstanceHasScript(WorldObject const *obj, char const *scriptName)
static constexpr uint32 MAX_DUNGEON_ENCOUNTERS_PER_BOSS
#define OUT_LOAD_INST_DATA_FAIL
@ 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
#define OUT_SAVE_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA
#define OUT_LOAD_INST_DATA(a)
std::map< uint32, uint32 > ObjectInfoMap
std::pair< DoorInfoMap::const_iterator, DoorInfoMap::const_iterator > DoorInfoMapBounds
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
std::set< ObjectGuid > GuidSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
Role Based Access Control related classes definition.
@ GAMEOBJECT_TYPE_FISHINGNODE
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Respawn(bool force=false)
static char const * ToConstant(Enum value)
void SetGoState(GOState state)
TeamId GetTeamIdInInstance() const
void UpdateInstanceLock(UpdateBossStateSaveDataEvent const &updateSaveDataEvent)
Result Load(char const *data)
void SetAdditionalData(UpdateAdditionalSaveDataEvent const &data)
void FillDataFrom(std::string const &data)
void FillData(bool withValues=true)
void SetBossState(UpdateBossStateSaveDataEvent const &data)
std::string GetSaveData()
void UpdateMinionState(Creature *minion, EncounterState state)
virtual bool SetBossState(uint32 id, EncounterState state)
virtual void OnCreatureCreate(Creature *creature) override
void DoCloseDoorOrButton(ObjectGuid guid)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
uint32 GetCombatResurrectionChargeInterval() const
void UpdateLfgEncounterState(BossInfo const *bossInfo)
Creature * GetCreature(uint32 type)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void LoadDungeonEncounterData(T const &encounters)
uint32 _combatResurrectionTimer
void DoUpdateWorldState(int32 worldStateId, int32 value)
Optional< uint32 > GetEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const
void DoCastSpellOnPlayer(Player *player, uint32 spell, bool includePets=false, bool includeControlled=false)
virtual bool CheckAchievementCriteriaMeet(uint32, Player const *, Unit const *=nullptr, uint32=0)
InstanceScript(InstanceMap *map)
void Load(char const *data)
virtual void OnCreatureRemove(Creature *creature) override
static bool ServerAllowsTwoSideGroups()
void SendBossKillCredit(uint32 encounterId)
virtual ObjectGuid GetGuidData(uint32 type) const override
void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
virtual void OnGameObjectRemove(GameObject *go) override
BossInfo * GetBossInfo(uint32 id)
static char const * GetBossStateName(uint8 state)
ObjectGuidMap _objectGuids
void DoUpdateCriteria(CriteriaType type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
DungeonEncounterEntry const * GetBossDungeonEncounter(uint32 id) const
void AddMinion(Creature *minion, bool add)
ObjectInfoMap _gameObjectInfo
EncounterState GetBossState(uint32 id) const
void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr) override
void InitializeCombatResurrections(uint8 charges=1, uint32 interval=0)
bool IsEncounterCompletedInMaskByBossId(uint32 completedEncountersMask, uint32 bossId) const
uint32 _temporaryEntranceId
virtual Optional< uint32 > ComputeEntranceLocationForCompletedEncounters(uint32 completedEncountersMask) const
void AddObject(Creature *obj, bool add)
void DoRespawnGameObject(ObjectGuid guid, Seconds timeToDespawn=1min)
void UseCombatResurrection()
virtual void OnGameObjectCreate(GameObject *go) override
virtual bool IsEncounterInProgress() const
ObjectInfoMap _creatureInfo
void UpdateCombatResurrection(uint32 diff)
void ResetCombatResurrections()
bool _combatResurrectionTimerStarted
virtual void AddDoor(GameObject *door, bool add)
void RegisterPersistentScriptValue(PersistentInstanceScriptValueBase *value)
void LoadMinionData(MinionData const *data)
void SendEncounterStart(uint32 inCombatResCount=0, uint32 maxInCombatResCount=0, uint32 inCombatResChargeRecovery=0, uint32 nextCombatResChargeTime=0)
void LoadDoorData(DoorData const *data)
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
void SetEntranceLocation(uint32 worldSafeLocationId)
std::vector< BossInfo > bosses
virtual ~InstanceScript()
std::string UpdateAdditionalSaveData(std::string const &oldData, UpdateAdditionalSaveDataEvent const &event)
void DoRemoveAurasDueToSpellOnPlayer(Player *player, uint32 spell, bool includePets=false, bool includeControlled=false)
GameObject * GetGameObject(uint32 type)
void LoadBossBoundaries(BossBoundaryData const &data)
virtual void AfterDataLoad()
void AddCombatResurrectionCharge()
virtual void UpdateDoorState(GameObject *door)
bool _SkipCheckRequiredBosses(Player const *player=nullptr) const
uint8 _combatResurrectionCharges
bool IsEncounterCompleted(uint32 dungeonEncounterId) const
std::string UpdateBossStateSaveData(std::string const &oldData, UpdateBossStateSaveDataEvent const &event)
void SetHeaders(std::string const &dataHeaders)
std::vector< InstanceSpawnGroupInfo > const *const _instanceSpawnGroups
ObjectGuid GetObjectGuid(uint32 type) const
void DoSendNotifyToInstance(char const *format,...)
void LoadObjectData(ObjectData const *creatureData, ObjectData const *gameObjectData)
void SetSpawnGroupInactive(uint32 groupId)
bool SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn=false, bool force=false, std::vector< WorldObject * > *spawnedObjects=nullptr)
MapDifficultyEntry const * GetMapDifficulty() const
void SendToPlayers(WorldPacket const *data) const
GameObject * GetGameObject(ObjectGuid const &guid)
bool IsSpawnGroupActive(uint32 groupId) const
Difficulty GetDifficultyID() const
InstanceMap * ToInstanceMap()
uint32 GetInstanceId() const
PlayerList const & GetPlayers() const
Creature * GetCreature(ObjectGuid const &guid)
static ObjectGuid const Empty
static ObjectGuid GetGUID(Object const *o)
InstanceScript & _instance
void NotifyValueChanged()
PersistentInstanceScriptValueBase(InstanceScript &instance, char const *name, std::variant< int64, double > value)
virtual ~PersistentInstanceScriptValueBase()
UpdateAdditionalSaveDataEvent CreateEvent() const
static void SendToPlayer(Player const *player, PhaseShift const &phaseShift)
WorldSession * GetSession() const
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
bool IsLockedToDungeonEncounter(uint32 dungeonEncounterId) const
std::array< ObjectGuid, MAX_SUMMON_SLOT > m_SummonSlot
void AtEndOfEncounter(EncounterType type)
void AtStartOfEncounter(EncounterType type)
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
uint32 DungeonEncounterID
WorldPacket const * Write() override
uint8 TargetFramePriority
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
uint8 TargetFramePriority
WorldPacket const * Write() override
uint32 CombatResChargeRecovery
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
uint32 CombatResChargeRecovery
WorldPacket const * Write() override
uint32 NextCombatResChargeTime
uint32 MaxInCombatResCount
WorldPacket const * Write() override
bool HasPermission(uint32 permissionId)
virtual void TriggerGameEvent(uint32 gameEventId, WorldObject *source=nullptr, WorldObject *target=nullptr)
virtual void ProcessEvent(WorldObject *obj, uint32 eventId, WorldObject *invoker)
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
ObjectData const creatureData[]
ObjectData const gameObjectData[]
TC_GAME_API uint32 GetId(std::string_view username)
TC_GAME_API void TriggerForMap(uint32 gameEventId, Map *map, WorldObject *source=nullptr, WorldObject *target=nullptr)
TC_GAME_API void TriggerForPlayer(uint32 gameEventId, Player *source)
@ RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES
const_iterator begin() const
const_iterator end() const
StorageType::const_iterator const_iterator
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
EncounterDoorBehavior Behavior
EncounterDoorBehavior Behavior
int32 CompleteWorldStateID
bool IsUsingEncounterLocks() const