81 return achievementIds;
92 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Achievement already earned",
100 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Wrong faction",
112 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Wrong covenant",
170 if (std::vector<AchievementEntry const*>
const* achRefList =
sAchievementMgr->GetAchievementByReferencedId(achievement->
ID))
195 progress += criteriaProgress->Counter;
216 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
219 achievementDeleted.
AchievementID = completedAchievement.first;
248 if (achievementResult)
252 Field* fields = achievementResult->Fetch();
272 }
while (achievementResult->NextRow());
280 Field* fields = criteriaResult->Fetch();
289 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement criteria {} data has been removed from the table `character_achievement_progress`.",
id);
303 progress.
Date = date;
306 }
while (criteriaResult->NextRow());
316 if (!completedAchievement.second.Changed)
320 stmt->
setUInt32(0, completedAchievement.first);
326 stmt->
setUInt32(1, completedAchievement.first);
327 stmt->
setInt64(2, completedAchievement.second.Date);
330 completedAchievement.second.Changed =
false;
336 for (std::pair<uint32 const, CriteriaProgress>& criteriaProgres :
_criteriaProgress)
338 if (!criteriaProgres.second.Changed)
343 stmt->
setUInt32(1, criteriaProgres.first);
346 if (criteriaProgres.second.Counter)
350 stmt->
setUInt32(1, criteriaProgres.first);
351 stmt->
setUInt64(2, criteriaProgres.second.Counter);
352 stmt->
setInt64(3, criteriaProgres.second.Date);
356 criteriaProgres.second.Changed =
false;
370 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
372 AchievementEntry const* achievement = filterInvisible(completedAchievement);
377 earned.
Id = completedAchievement.first;
387 for (std::pair<uint32 const, CriteriaProgress>
const& criteriaProgres :
_criteriaProgress)
392 progress.
Id = criteriaProgres.first;
393 progress.
Quantity = criteriaProgres.second.Counter;
394 progress.
Player = criteriaProgres.second.PlayerGUID;
404 accountProgress.
Id = criteriaProgres.first;
405 accountProgress.
Quantity = criteriaProgres.second.Counter;
407 accountProgress.
Flags = 0;
415 if (!allAccountCriteria.
Progress.empty())
429 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
431 AchievementEntry const* achievement = filterInvisible(completedAchievement);
436 earned.
Id = completedAchievement.first;
446 for (std::pair<uint32 const, CriteriaProgress>
const& criteriaProgres :
_criteriaProgress)
449 progress.
Id = criteriaProgres.first;
450 progress.
Quantity = criteriaProgres.second.Counter;
451 progress.
Player = criteriaProgres.second.PlayerGUID;
482 TC_LOG_INFO(
"criteria.achievement",
"PlayerAchievementMgr::CompletedAchievement({}). {}", achievement->
ID,
GetOwnerInfo());
497 sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
513 if (achievement->
ID == 1793)
534 std::string subject = reward->
Subject;
535 std::string text = reward->
Body;
602 criteriaUpdate.
Flags = 0;
604 criteriaUpdate.
Flags = timedCompleted ? 1 : 0;
628 TC_LOG_DEBUG(
"criteria.achievement",
"PlayerAchievementMgr::SendAchievementEarned({})", achievement->
ID);
636 guild->BroadcastWorker(_localizer,
_owner);
646 sWorld->SendGlobalMessage(serverFirstAchievement.
Write());
658 auto achievementEarnedBuilder = [&](
Player const* receiver)
666 achievementEarned.
Time += receiver->GetSession()->GetTimezoneOffset();
667 receiver->SendDirectMessage(achievementEarned.
Write());
670 achievementEarnedBuilder(
_owner);
687 return sCriteriaMgr->GetPlayerCriteriaByType(type, asset);
699 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
704 guildAchievementDeleted.
AchievementID = completedAchievement.first;
705 guildAchievementDeleted.
GuildGUID = guid;
734 if (achievementResult)
738 Field* fields = achievementResult->Fetch();
748 for (std::string_view guid :
Trinity::Tokenize(fields[2].GetStringView(),
',',
false))
755 }
while (achievementResult->NextRow());
763 Field* fields = criteriaResult->Fetch();
773 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement criteria {} data removed from table `guild_achievement_progress`.",
id);
786 progress.
Date = date;
787 progress.
PlayerGUID = ObjectGuid::Create<HighGuid::Player>(guid);
789 }
while (criteriaResult->NextRow());
798 if (!completedAchievement.second.Changed)
803 stmt->
setUInt32(1, completedAchievement.first);
808 stmt->
setUInt32(1, completedAchievement.first);
809 stmt->
setInt64(2, completedAchievement.second.Date);
811 auto completersItr = completedAchievement.second.CompletingPlayers.begin();
812 auto completersEnd = completedAchievement.second.CompletingPlayers.end();
813 if (completersItr != completersEnd)
816 while (++completersItr != completersEnd)
823 completedAchievement.second.Changed =
false;
826 for (std::pair<uint32 const, CriteriaProgress>& criteriaProgres :
_criteriaProgress)
828 if (!criteriaProgres.second.Changed)
833 stmt->
setUInt32(1, criteriaProgres.first);
838 stmt->
setUInt32(1, criteriaProgres.first);
839 stmt->
setUInt64(2, criteriaProgres.second.Counter);
840 stmt->
setInt64(3, criteriaProgres.second.Date);
841 stmt->
setUInt64(4, criteriaProgres.second.PlayerGUID.GetCounter());
844 criteriaProgres.second.Changed =
false;
854 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
856 AchievementEntry const* achievement = filterInvisible(completedAchievement);
861 earned.
Id = completedAchievement.first;
880 auto progress = this->_criteriaProgress.find(node->Criteria->ID);
881 if (progress != this->_criteriaProgress.end())
883 WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress.emplace_back();
884 guildCriteriaProgress.CriteriaID = node->Criteria->ID;
885 guildCriteriaProgress.DateCreated = 0;
886 guildCriteriaProgress.DateStarted = 0;
887 guildCriteriaProgress.DateUpdated.SetUtcTimeFromUnixTime(progress->second.Date);
888 guildCriteriaProgress.DateUpdated += receiver->GetSession()->GetTimezoneOffset();
889 guildCriteriaProgress.Quantity = progress->second.Counter;
890 guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
891 guildCriteriaProgress.Flags = 0;
898 receiver->SendDirectMessage(guildCriteriaUpdate.Write());
904 guildCriteriaUpdate.
Progress.reserve(trackedCriterias.size());
906 for (
uint32 criteriaId : trackedCriterias)
913 guildCriteriaProgress.
CriteriaID = criteriaId;
918 guildCriteriaProgress.
Quantity = progress->second.Counter;
919 guildCriteriaProgress.
PlayerGUID = progress->second.PlayerGUID;
920 guildCriteriaProgress.
Flags = 0;
934 guildAchievementMembers.
Member.reserve(itr->second.CompletingPlayers.size());
935 for (
ObjectGuid const& member : itr->second.CompletingPlayers)
936 guildAchievementMembers.
Member.emplace_back(member);
944 TC_LOG_DEBUG(
"criteria.achievement",
"GuildAchievementMgr::CompletedAchievement({})", achievement->
ID);
965 if (ref.GetSource()->GetGuildId() ==
_owner->
GetId())
978 sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
991 guildCriteriaProgress.
DateUpdated += member->GetSession()->GetTimezoneOffset();
994 guildCriteriaProgress.
Flags = 0;
996 member->SendDirectMessage(guildCriteriaUpdate.
Write());
1004 guildCriteriaDeleted.
CriteriaID = criteriaId;
1018 sWorld->SendGlobalMessage(serverFirstAchievement.
Write());
1085 if (itr->second == SystemTimePoint ::min())
1088 if (itr->second == SystemTimePoint::max())
1115 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement references.");
1152 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement scripts. DB table `achievement_scripts` is empty.");
1158 Field* fields = result->Fetch();
1166 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_scripts` contains non-existing Achievement (ID: {}), skipped.", achievementId);
1171 while (result->NextRow());
1191 TC_LOG_INFO(
"server.loading",
">> Loaded 0 realm first completed achievements. DB table `character_achievement` is empty.");
1197 Field* fields = result->Fetch();
1204 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement {} data has been removed from the table `character_achievement`.", achievementId);
1215 while (result->NextRow());
1227 QueryResult result =
WorldDatabase.Query(
"SELECT ID, TitleA, TitleH, ItemID, Sender, Subject, Body, MailTemplateID FROM achievement_reward");
1231 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty.");
1237 Field* fields = result->Fetch();
1242 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` contains a wrong achievement ID ({}), ignored.",
id);
1258 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not contain title or item reward data. Ignored.",
id);
1263 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) contains the title (A: {} H: {}) for only one team.",
id, reward.
TitleId[0], reward.
TitleId[1]);
1270 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (Entry: {}) contains an invalid title id ({}) in `title_A`, set to 0",
id, reward.
TitleId[0]);
1280 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (Entry: {}) contains an invalid title id ({}) in `title_H`, set to 0",
id, reward.
TitleId[1]);
1290 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) contains an invalid creature ID {} as sender, mail reward skipped.",
id, reward.
SenderCreatureId);
1297 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but contains an item reward. Item will not be rewarded.",
id);
1300 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but contains a mail subject.",
id);
1302 if (!reward.
Body.empty())
1303 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but contains mail text.",
id);
1306 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but has a MailTemplate.",
id);
1313 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) is using an invalid MailTemplate ({}).",
id, reward.
MailTemplateId);
1316 else if (!reward.
Subject.empty() || !reward.
Body.empty())
1317 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) is using MailTemplate ({}) and mail subject/text.",
id, reward.
MailTemplateId);
1324 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) contains an invalid item id {}, reward mail will not contain the rewarded item.",
id, reward.
ItemId);
1330 }
while (result->NextRow());
1346 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement reward locale strings. DB table `achievement_reward_locale` is empty.");
1352 Field* fields = result->Fetch();
1359 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward_locale` (ID: {}) contains locale strings for a non-existing achievement reward.",
id);
1370 }
while (result->NextRow());
@ CHAR_INS_GUILD_ACHIEVEMENT_CRITERIA
@ CHAR_DEL_ALL_GUILD_ACHIEVEMENTS
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA
@ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS
@ CHAR_INS_CHAR_ACHIEVEMENT
@ CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT
@ CHAR_DEL_INVALID_ACHIEVMENT
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
@ CHAR_INS_GUILD_ACHIEVEMENT
@ CHAR_DEL_GUILD_ACHIEVEMENT
@ CHAR_DEL_GUILD_ACHIEVEMENT_CRITERIA
@ CHAR_DEL_ALL_GUILD_ACHIEVEMENT_CRITERIA
@ CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA
@ CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA_GUILD
@ CHAR_DEL_CHAR_ACHIEVEMENT
LocaleConstant GetLocaleByName(std::string_view name)
constexpr bool IsValidLocale(LocaleConstant locale)
@ CRITERIA_FLAG_CU_ACCOUNT
@ CRITERIA_FLAG_CU_PLAYER
std::vector< Criteria const * > CriteriaList
DB2Storage< AchievementEntry > sAchievementStore("Achievement.db2", &AchievementLoadInfo::Instance)
DB2Storage< CharTitlesEntry > sCharTitlesStore("CharTitles.db2", &CharTitlesLoadInfo::Instance)
DB2Storage< MailTemplateEntry > sMailTemplateStore("MailTemplate.db2", &MailTemplateLoadInfo::Instance)
@ ACHIEVEMENT_FACTION_HORDE
@ ACHIEVEMENT_FACTION_ALLIANCE
@ ACHIEVEMENT_FACTION_ANY
@ ACHIEVEMENT_FLAG_TRACKING_FLAG
@ ACHIEVEMENT_FLAG_COUNTER
@ ACHIEVEMENT_FLAG_ACCOUNT
@ ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS
@ ACHIEVEMENT_FLAG_HIDDEN
@ ACHIEVEMENT_FLAG_REALM_FIRST_REACH
@ ACHIEVEMENT_FLAG_REALM_FIRST_KILL
@ ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER
@ ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
std::shared_ptr< PreparedResultSet > PreparedQueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::minutes Minutes
Minutes shorthand typedef.
@ GUILD_NEWS_GUILD_ACHIEVEMENT
@ GUILD_NEWS_PLAYER_ACHIEVEMENT
@ BROADCAST_TEXT_ACHIEVEMENT_EARNED
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_INFO(filterType__, message__,...)
#define TC_LOG_TRACE(filterType__, message__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
Role Based Access Control related classes definition.
@ CHAT_MSG_GUILD_ACHIEVEMENT
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
void LoadCompletedAchievements()
AchievementRewardLocale const * GetAchievementRewardLocale(AchievementEntry const *achievement) const
std::unordered_map< uint32, AchievementRewardLocale > _achievementRewardLocales
std::unordered_map< uint32, uint32 > _achievementScripts
bool IsRealmCompleted(AchievementEntry const *achievement) const
std::unordered_map< uint32, std::vector< AchievementEntry const * > > _achievementListByReferencedId
void SetRealmCompleted(AchievementEntry const *achievement)
void LoadAchievementReferenceList()
std::unordered_map< uint32, AchievementReward > _achievementRewards
static AchievementGlobalMgr * Instance()
AchievementReward const * GetAchievementReward(AchievementEntry const *achievement) const
uint32 GetAchievementScriptId(uint32 achievementId) const
std::vector< AchievementEntry const * > const * GetAchievementByReferencedId(uint32 id) const
void LoadAchievementScripts()
std::unordered_map< uint32, SystemTimePoint > _allCompletedAchievements
bool HasAchieved(uint32 achievementId) const
uint32 _achievementPoints
bool RequiredAchievementSatisfied(uint32 achievementId) const override
virtual void CompletedAchievement(AchievementEntry const *entry, Player *referencePlayer)=0
void CompletedCriteriaTree(CriteriaTree const *tree, Player *referencePlayer) override
void CheckAllAchievementCriteria(Player *referencePlayer)
bool IsCompletedAchievement(AchievementEntry const *entry)
std::unordered_map< uint32, CompletedAchievementData > _completedAchievements
uint32 GetAchievementPoints() const
void AfterCriteriaTreeUpdate(CriteriaTree const *tree, Player *referencePlayer) override
bool CanCompleteCriteriaTree(CriteriaTree const *tree) override
bool CanUpdateCriteriaTree(Criteria const *criteria, CriteriaTree const *tree, Player *referencePlayer) const override
std::vector< uint32 > GetCompletedAchievementIds() const
ObjectGuid const & GetGUID() const
CriteriaProgress * GetCriteriaProgress(Criteria const *entry)
virtual bool CanUpdateCriteriaTree(Criteria const *criteria, CriteriaTree const *tree, Player *referencePlayer) const
CriteriaProgressMap _criteriaProgress
bool IsCompletedCriteriaTree(CriteriaTree const *tree)
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject const *ref=nullptr, Player *referencePlayer=nullptr)
static char const * GetCriteriaTypeString(CriteriaType type)
static void WalkCriteriaTree(CriteriaTree const *tree, Func const &func)
static std::span< CriteriaType const > GetRetroactivelyUpdateableCriteriaTypes()
void ApplyHotfix(uint32 id, void(*fixer)(T *), bool notifyClient=false)
Class used to access individual fields of database query result.
uint64 GetUInt64() const noexcept
uint32 GetUInt32() const noexcept
std::string_view GetStringView() const noexcept
std::string GetString() const noexcept
int64 GetInt64() const noexcept
std::string GetOwnerInfo() const override
void SendCriteriaUpdate(Criteria const *entry, CriteriaProgress const *progress, Seconds timeElapsed, bool timedCompleted) const override
void SendAchievementEarned(AchievementEntry const *achievement) const
void SendAchievementInfo(Player *receiver, uint32 achievementId=0) const
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult)
GuildAchievementMgr(Guild *owner)
static void DeleteFromDB(ObjectGuid const &guid)
void CompletedAchievement(AchievementEntry const *entry, Player *referencePlayer) override
void SendCriteriaProgressRemoved(uint32 criteriaId) override
CriteriaList const & GetCriteriaByType(CriteriaType type, uint32 asset) const override
void SendAchievementMembers(Player *receiver, uint32 achievementId) const
void SendAllData(Player const *receiver) const override
void SendPacket(WorldPacket const *data) const override
void SendAllTrackedCriterias(Player *receiver, std::set< uint32 > const &trackedCriterias) const
void SaveToDB(CharacterDatabaseTransaction trans)
void BroadcastPacket(WorldPacket const *packet) const
std::vector< Player * > GetMembersTrackingCriteria(uint32 criteriaId) const
ObjectGuid::LowType GetId() const
std::string const & GetName() const
void BroadcastWorker(Do &&_do, Player const *except=nullptr) const
ObjectGuid GetGUID() const
virtual void SaveToDB(CharacterDatabaseTransaction trans)
static Item * CreateItem(uint32 itemEntry, uint32 count, ItemContext context, Player const *player=nullptr, bool addDefaultBonuses=true)
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0)
MailDraft & AddItem(Item *item)
LowType GetCounter() const
static ObjectGuid const Empty
std::string ToString() const
static void AddLocaleString(std::string_view value, LocaleConstant localeConstant, std::vector< std::string > &data)
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
bool ModifierTreeSatisfied(uint32 modifierTreeId) const
void SendAllData(Player const *receiver) const override
void SendAchievementEarned(AchievementEntry const *achievement) const
void CompletedAchievement(AchievementEntry const *entry, Player *referencePlayer) override
static void DeleteFromDB(ObjectGuid const &guid)
void SendCriteriaUpdate(Criteria const *entry, CriteriaProgress const *progress, Seconds timeElapsed, bool timedCompleted) const override
void SendAchievementInfo(Player *receiver, uint32 achievementId=0) const
void SaveToDB(CharacterDatabaseTransaction trans)
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult)
void SendCriteriaProgressRemoved(uint32 criteriaId) override
PlayerAchievementMgr(Player *owner)
void SendPacket(WorldPacket const *data) const override
CriteriaList const & GetCriteriaByType(CriteriaType type, uint32 asset) const override
std::string GetOwnerInfo() const override
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
static Team TeamForRace(uint8 race)
Gender GetNativeGender() const override
void SendDirectMessage(WorldPacket const *data) const
WorldSession * GetSession() const
void UpdateCriteria(CriteriaType type, uint64 miscValue1=0, uint64 miscValue2=0, uint64 miscValue3=0, WorldObject *ref=nullptr)
ObjectGuid::LowType GetGuildId() const
bool IsGameMaster() const
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Group * GetGroup(Optional< uint8 > partyIndex)
void setString(uint8 index, std::string &&value)
void setUInt32(uint8 index, uint32 value)
void setInt64(uint8 index, int64 value)
void setUInt64(uint8 index, uint64 value)
std::string const & GetName() const
CriteriaProgress Progress
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
uint32 EarnerVirtualRealm
std::vector< CriteriaProgress > Progress
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< EarnedAchievement > Earned
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Duration< Seconds > ElapsedTime
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< GuildAchievementMember > Member
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< GuildCriteriaProgress > Progress
WorldPacket const * Write() override
ObjectGuid GetBattlenetAccountGUID() const
LocaleConstant GetSessionDbLocaleIndex() const
Minutes GetTimezoneOffset() const
bool PlayerLoading() const
bool HasPermission(uint32 permissionId)
void SetUtcTimeFromUnixTime(std::time_t unixTime)
@ CONFIG_LISTEN_RANGE_SAY
WowTime const * GetUtcWowTime()
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
auto MapGetValuePtr(M &map, typename M::key_type const &key)
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
OutputIt StringFormatTo(OutputIt out, FormatString< Args... > fmt, Args &&... args) noexcept
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
@ RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS
@ RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS
std::vector< std::string > Body
std::vector< std::string > Subject
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
GuidSet CompletingPlayers
::Criteria const * Criteria
CriteriaTreeEntry const * Entry
AchievementEntry const * Achievement
CriteriaEntry const * Entry
AchievementEntry const * operator()(std::pair< uint32 const, CompletedAchievementData > const &val)
std::vector< CriteriaProgress > Progress
std::vector< EarnedAchievement > Earned
Duration< Seconds > TimeFromCreate
Duration< Seconds > TimeFromStart
uint32 NativeRealmAddress
uint32 VirtualRealmAddress