50#ifdef TRINITY_API_USE_DYNAMIC_LINKING
52 auto const scriptname =
sObjectMgr->GetScriptName(scriptId);
53 ASSERT(!scriptname.empty());
56 module_reference =
sScriptMgr->AcquireModuleReferenceOfScriptName(scriptname);
75 for (std::vector<BossInfo>::const_iterator itr =
bosses.begin(); itr !=
bosses.end(); ++itr)
108 ObjectGuidMap::const_iterator i =
_objectGuids.find(type);
131 for (
char header : dataHeaders)
139 if (entry.BossId <
bosses.size())
140 bosses[entry.BossId].boundary.push_back(entry.Boundary);
182 ASSERT(objectInfo.find(data->
entry) == objectInfo.end());
191 if (range.first == range.second)
195 for (; range.first != range.second && open; ++range.first)
197 DoorInfo const& info = range.first->second;
242 enum states { BLOCK, SPAWN, FORCEBLOCK };
243 std::unordered_map<uint32, states> newStates;
248 if (curValue == FORCEBLOCK)
256 curValue = FORCEBLOCK;
260 for (
auto const& pair : newStates)
262 uint32 const groupId = pair.first;
263 bool const doSpawn = (pair.second == SPAWN);
309 if (range.first == range.second)
312 for (; range.first != range.second; ++range.first)
314 DoorInfo const& data = range.first->second;
335 itr->second.bossInfo->minion.insert(minion->
GetGUID());
337 itr->second.bossInfo->minion.erase(minion->
GetGUID());
347 bossInfo->
state = state;
353 if (bossInfo->
state == state)
363 for (GuidSet::iterator i = bossInfo->
minion.begin(); i != bossInfo->
minion.end(); ++i)
365 if (minion->isWorldBoss() && minion->IsAlive())
368 bossInfo->
state = state;
373 for (GuidSet::iterator i = bossInfo->
door[type].begin(); i != bossInfo->
door[type].end(); ++i)
378 for (GuidSet::iterator i =
minions.begin(); i !=
minions.end(); ++i)
395 for (
size_t i = 0; i <
bosses.size(); ++i)
410 std::istringstream loadStream(data);
440 for (std::vector<BossInfo>::iterator i =
bosses.begin(); i !=
bosses.end(); ++i, ++bossId)
457 std::ostringstream saveStream;
465 return saveStream.str();
471 data << header <<
' ';
477 data <<
uint32(bossInfo.state) <<
' ';
487 TC_LOG_DEBUG(
"scripts",
"InstanceScript: HandleGameObject failed");
500 go->UseDoorOrButton(withRestoreTime, useAlternativeState);
502 go->ResetDoorOrButton();
505 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoUseDoorOrButton can't use gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
508 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoUseDoorOrButton failed");
521 go->ResetDoorOrButton();
524 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoCloseDoorOrButton can't use gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
527 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoCloseDoorOrButton failed");
534 switch (go->GetGoType())
541 TC_LOG_ERROR(
"scripts",
"InstanceScript: DoRespawnGameObject can't respawn gameobject entry {}, because type is {}.", go->GetEntry(), go->GetGoType());
550 go->SetRespawnTime(timeToDespawn.count());
553 TC_LOG_DEBUG(
"scripts",
"InstanceScript: DoRespawnGameObject failed");
563 if (
Player* player = itr->GetSource())
564 player->SendUpdateWorldState(uiStateId, uiStateData);
567 TC_LOG_DEBUG(
"scripts",
"DoUpdateWorldState attempt send data but no players in map.");
578 va_start(ap, format);
580 vsnprintf(buff, 1024, format, ap);
583 if (
Player* player = i->GetSource())
585 session->SendNotification(
"%s", buff);
596 if (
Player* player = i->GetSource())
597 player->UpdateAchievementCriteria(type, miscValue1, miscValue2, unit);
607 if (
Player* player = i->GetSource())
608 player->StartTimedAchievement(type, entry);
618 if (
Player* player = i->GetSource())
619 player->RemoveTimedAchievement(type, entry);
625 for (
auto itr = playerList.
begin(); itr != playerList.
end(); ++itr)
643 summon->RemoveAurasDueToSpell(spell);
646 if (!includeControlled)
651 if (
Unit* controlled = *itr2)
652 if (controlled->IsInWorld() && controlled->GetTypeId() ==
TYPEID_UNIT)
653 controlled->RemoveAurasDueToSpell(spell);
660 for (
auto itr = playerList.
begin(); itr != playerList.
end(); ++itr)
678 summon->CastSpell(player, spell,
true);
681 if (!includeControlled)
686 if (
Unit* controlled = *itr2)
687 if (controlled->IsInWorld() && controlled->GetTypeId() ==
TYPEID_UNIT)
688 controlled->CastSpell(player, spell,
true);
699 TC_LOG_ERROR(
"misc",
"Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map {} not have implementation for achievement criteria {}",
718 data <<
uint8(param1);
723 data <<
uint8(param1);
726 data <<
uint8(param1);
727 data <<
uint8(param2);
745 for (
auto const& encounter : *encounters)
747 if (encounter->creditType == type && encounter->creditEntry == creditEntry)
750 if (encounter->lastEncounterDungeon)
752 dungeonId = encounter->lastEncounterDungeon;
762 for (
auto const& ref : players)
764 if (
Player* player = ref.GetSource())
766 if (
Group* grp = player->GetGroup())
768 if (grp->isLFGGroup())
795 return "NOT_STARTED";
797 return "IN_PROGRESS";
805 return "TO_BE_DECIDED";
814 return instance->GetScriptName() == scriptName;
AchievementCriteriaTimedTypes
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
std::chrono::seconds Seconds
Seconds shorthand typedef.
bool InstanceHasScript(WorldObject const *obj, char const *scriptName)
#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__,...)
#define TC_LOG_ERROR(filterType__,...)
std::set< ObjectGuid > GuidSet
@ ENCOUNTER_CREDIT_KILL_CREATURE
@ ENCOUNTER_CREDIT_CAST_SPELL
std::vector< std::unique_ptr< DungeonEncounter const > > DungeonEncounterList
Role Based Access Control related classes definition.
@ GAMEOBJECT_TYPE_FISHINGNODE
void DoZoneInCombat(Creature *creature=nullptr)
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void Respawn(bool force=false)
void SetGoState(GOState state)
TeamId GetTeamIdInInstance() const
virtual std::string GetSaveData()
void UpdateMinionState(Creature *minion, EncounterState state)
uint32 GetCompletedEncounterMask() const
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)
std::vector< char > headers
Creature * GetCreature(uint32 type)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
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)
virtual void ReadSaveDataMore(std::istringstream &)
void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
uint32 completedEncounters
virtual void Load(char const *data)
virtual void OnCreatureRemove(Creature *creature) override
static bool ServerAllowsTwoSideGroups()
virtual ObjectGuid GetGuidData(uint32 type) const override
void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime=0, bool useAlternativeState=false)
void UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit *source)
virtual void OnGameObjectRemove(GameObject *go) override
BossInfo * GetBossInfo(uint32 id)
static char const * GetBossStateName(uint8 state)
void WriteSaveDataBossStates(std::ostringstream &data)
ObjectGuidMap _objectGuids
void UpdateEncounterStateForKilledCreature(uint32 creatureId, Unit *source)
void AddMinion(Creature *minion, bool add)
ObjectInfoMap _gameObjectInfo
EncounterState GetBossState(uint32 id) const
void AddObject(Creature *obj, bool add)
void DoRespawnGameObject(ObjectGuid guid, Seconds timeToDespawn=1min)
virtual void OnGameObjectCreate(GameObject *go) override
virtual bool IsEncounterInProgress() const
ObjectInfoMap _creatureInfo
virtual void AddDoor(GameObject *door, bool add)
bool ReadSaveDataHeaders(std::istringstream &data)
void WriteSaveDataHeaders(std::ostringstream &data)
void LoadMinionData(MinionData const *data)
void LoadDoorData(DoorData const *data)
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
std::vector< BossInfo > bosses
void DoRemoveAurasDueToSpellOnPlayer(Player *player, uint32 spell, bool includePets=false, bool includeControlled=false)
void ReadSaveDataBossStates(std::istringstream &data)
GameObject * GetGameObject(uint32 type)
void LoadBossBoundaries(BossBoundaryData const &data)
virtual void UpdateDoorState(GameObject *door)
bool _SkipCheckRequiredBosses(Player const *player=nullptr) const
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
void DoUpdateWorldState(uint32 worldstateId, uint32 worldstateValue)
void SetHeaders(std::string const &dataHeaders)
std::vector< InstanceSpawnGroupInfo > const *const _instanceSpawnGroups
void SendEncounterUnit(EncounterFrameType type, Unit const *unit=nullptr, uint8 param1=0, uint8 param2=0)
ObjectGuid GetObjectGuid(uint32 type) const
virtual void WriteSaveDataMore(std::ostringstream &)
void UpdateEncounterStateForSpellCast(uint32 spellId, Unit *source)
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)
void SendToPlayers(WorldPacket const *data) const
GameObject * GetGameObject(ObjectGuid const &guid)
bool IsSpawnGroupActive(uint32 groupId) const
char const * GetMapName() const
InstanceMap * ToInstanceMap()
Difficulty GetDifficulty() const
uint32 GetInstanceId() const
PlayerList const & GetPlayers() const
Creature * GetCreature(ObjectGuid const &guid)
static ObjectGuid const Empty
PackedGuid const & GetPackGUID() const
static ObjectGuid GetGUID(Object const *o)
WorldSession * GetSession() const
void setUInt32(uint8 index, uint32 value)
void setString(uint8 index, std::string const &value)
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Player session in the World.
bool HasPermission(uint32 permissionId)
@ SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
ObjectData const gameObjectData[]
ObjectData const creatureData[]
@ RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES
const_iterator begin() const
const_iterator end() const
StorageType::const_iterator const_iterator
GuidSet door[MAX_DOOR_TYPES]