80 std::vector<uint32> achievementIds;
83 return achievement.first;
85 return achievementIds;
96 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Achievement already earned",
104 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Wrong faction",
116 TC_LOG_TRACE(
"criteria.achievement",
"AchievementMgr::CanUpdateCriteriaTree: (Id: {} Type {} Achievement {}) Wrong covenant",
174 if (std::vector<AchievementEntry const*>
const* achRefList =
sAchievementMgr->GetAchievementByReferencedId(achievement->
ID))
199 progress += criteriaProgress->Counter;
220 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
223 achievementDeleted.
AchievementID = completedAchievement.first;
252 if (achievementResult)
256 Field* fields = achievementResult->Fetch();
276 }
while (achievementResult->NextRow());
284 Field* fields = criteriaResult->Fetch();
293 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement criteria {} data has been removed from the table `character_achievement_progress`.",
id);
307 progress.
Date = date;
310 }
while (criteriaResult->NextRow());
320 if (!completedAchievement.second.Changed)
324 stmt->
setUInt32(0, completedAchievement.first);
330 stmt->
setUInt32(1, completedAchievement.first);
331 stmt->
setInt64(2, completedAchievement.second.Date);
334 completedAchievement.second.Changed =
false;
340 for (std::pair<uint32 const, CriteriaProgress>& criteriaProgres :
_criteriaProgress)
342 if (!criteriaProgres.second.Changed)
347 stmt->
setUInt32(1, criteriaProgres.first);
350 if (criteriaProgres.second.Counter)
354 stmt->
setUInt32(1, criteriaProgres.first);
355 stmt->
setUInt64(2, criteriaProgres.second.Counter);
356 stmt->
setInt64(3, criteriaProgres.second.Date);
360 criteriaProgres.second.Changed =
false;
374 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
376 AchievementEntry const* achievement = filterInvisible(completedAchievement);
381 earned.
Id = completedAchievement.first;
391 for (std::pair<uint32 const, CriteriaProgress>
const& criteriaProgres :
_criteriaProgress)
396 progress.
Id = criteriaProgres.first;
397 progress.
Quantity = criteriaProgres.second.Counter;
398 progress.
Player = criteriaProgres.second.PlayerGUID;
408 accountProgress.
Id = criteriaProgres.first;
409 accountProgress.
Quantity = criteriaProgres.second.Counter;
411 accountProgress.
Flags = 0;
419 if (!allAccountCriteria.
Progress.empty())
433 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
435 AchievementEntry const* achievement = filterInvisible(completedAchievement);
440 earned.
Id = completedAchievement.first;
450 for (std::pair<uint32 const, CriteriaProgress>
const& criteriaProgres :
_criteriaProgress)
453 progress.
Id = criteriaProgres.first;
454 progress.
Quantity = criteriaProgres.second.Counter;
455 progress.
Player = criteriaProgres.second.PlayerGUID;
486 TC_LOG_INFO(
"criteria.achievement",
"PlayerAchievementMgr::CompletedAchievement({}). {}", achievement->
ID,
GetOwnerInfo());
501 sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
527 std::string subject = reward->
Subject;
528 std::string text = reward->
Body;
595 criteriaUpdate.
Flags = 0;
597 criteriaUpdate.
Flags = timedCompleted ? 1 : 0;
621 TC_LOG_DEBUG(
"criteria.achievement",
"PlayerAchievementMgr::SendAchievementEarned({})", achievement->
ID);
629 guild->BroadcastWorker(_localizer,
_owner);
639 sWorld->SendGlobalMessage(serverFirstAchievement.
Write());
651 auto achievementEarnedBuilder = [&](
Player const* receiver)
659 achievementEarned.
Time += receiver->GetSession()->GetTimezoneOffset();
660 receiver->SendDirectMessage(achievementEarned.
Write());
670 achievementEarnedBuilder(
_owner);
680 return sCriteriaMgr->GetPlayerCriteriaByType(type, asset);
692 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
694 auto packetBuilder = [&](
Player const* receiver)
697 guildAchievementDeleted.
AchievementID = completedAchievement.first;
698 guildAchievementDeleted.
GuildGUID = guid;
700 guildAchievementDeleted.
TimeDeleted += receiver->GetSession()->GetTimezoneOffset();
701 receiver->SendDirectMessage(guildAchievementDeleted.
Write());
728 if (achievementResult)
732 Field* fields = achievementResult->Fetch();
742 for (std::string_view guid :
Trinity::Tokenize(fields[2].GetStringView(),
',',
false))
749 }
while (achievementResult->NextRow());
757 Field* fields = criteriaResult->Fetch();
767 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement criteria {} data removed from table `guild_achievement_progress`.",
id);
780 progress.
Date = date;
781 progress.
PlayerGUID = ObjectGuid::Create<HighGuid::Player>(guid);
783 }
while (criteriaResult->NextRow());
790 std::ostringstream guidstr;
793 if (!completedAchievement.second.Changed)
798 stmt->
setUInt32(1, completedAchievement.first);
803 stmt->
setUInt32(1, completedAchievement.first);
804 stmt->
setInt64(2, completedAchievement.second.Date);
805 for (
ObjectGuid memberGuid : completedAchievement.second.CompletingPlayers)
813 completedAchievement.second.Changed =
false;
816 for (std::pair<uint32 const, CriteriaProgress>& criteriaProgres :
_criteriaProgress)
818 if (!criteriaProgres.second.Changed)
823 stmt->
setUInt32(1, criteriaProgres.first);
828 stmt->
setUInt32(1, criteriaProgres.first);
829 stmt->
setUInt64(2, criteriaProgres.second.Counter);
830 stmt->
setInt64(3, criteriaProgres.second.Date);
831 stmt->
setUInt64(4, criteriaProgres.second.PlayerGUID.GetCounter());
834 criteriaProgres.second.Changed =
false;
844 for (std::pair<uint32 const, CompletedAchievementData>
const& completedAchievement :
_completedAchievements)
846 AchievementEntry const* achievement = filterInvisible(completedAchievement);
851 earned.
Id = completedAchievement.first;
870 auto progress = this->_criteriaProgress.find(node->Criteria->ID);
871 if (progress != this->_criteriaProgress.end())
873 WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress.emplace_back();
874 guildCriteriaProgress.CriteriaID = node->Criteria->ID;
875 guildCriteriaProgress.DateCreated = 0;
876 guildCriteriaProgress.DateStarted = 0;
877 guildCriteriaProgress.DateUpdated.SetUtcTimeFromUnixTime(progress->second.Date);
878 guildCriteriaProgress.DateUpdated += receiver->GetSession()->GetTimezoneOffset();
879 guildCriteriaProgress.Quantity = progress->second.Counter;
880 guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
881 guildCriteriaProgress.Flags = 0;
888 receiver->SendDirectMessage(guildCriteriaUpdate.Write());
894 guildCriteriaUpdate.
Progress.reserve(trackedCriterias.size());
896 for (
uint32 criteriaId : trackedCriterias)
903 guildCriteriaProgress.
CriteriaID = criteriaId;
908 guildCriteriaProgress.
Quantity = progress->second.Counter;
909 guildCriteriaProgress.
PlayerGUID = progress->second.PlayerGUID;
910 guildCriteriaProgress.
Flags = 0;
924 guildAchievementMembers.
Member.reserve(itr->second.CompletingPlayers.size());
925 for (
ObjectGuid const& member : itr->second.CompletingPlayers)
926 guildAchievementMembers.
Member.emplace_back(member);
934 TC_LOG_DEBUG(
"criteria.achievement",
"GuildAchievementMgr::CompletedAchievement({})", achievement->
ID);
954 for (
GroupReference const* ref = group->GetFirstMember(); ref !=
nullptr; ref = ref->
next())
955 if (
Player const* groupMember = ref->GetSource())
969 sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
982 guildCriteriaProgress.
DateUpdated += member->GetSession()->GetTimezoneOffset();
985 guildCriteriaProgress.
Flags = 0;
987 member->SendDirectMessage(guildCriteriaUpdate.
Write());
1009 sWorld->SendGlobalMessage(serverFirstAchievement.
Write());
1012 auto guildAchievementEarnedBuilder = [&](
Player const* receiver)
1018 guildAchievementEarned.
TimeEarned += receiver->GetSession()->GetTimezoneOffset();
1019 receiver->SendDirectMessage(guildAchievementEarned.
Write());
1077 if (itr->second == SystemTimePoint ::min())
1080 if (itr->second == SystemTimePoint::max())
1107 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement references.");
1144 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement scripts. DB table `achievement_scripts` is empty.");
1150 Field* fields = result->Fetch();
1153 std::string scriptName = fields[1].
GetString();
1158 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_scripts` contains non-existing Achievement (ID: {}), skipped.", achievementId);
1163 while (result->NextRow());
1183 TC_LOG_INFO(
"server.loading",
">> Loaded 0 realm first completed achievements. DB table `character_achievement` is empty.");
1189 Field* fields = result->Fetch();
1196 TC_LOG_ERROR(
"criteria.achievement",
"Non-existing achievement {} data has been removed from the table `character_achievement`.", achievementId);
1207 while (result->NextRow());
1219 QueryResult result =
WorldDatabase.Query(
"SELECT ID, TitleA, TitleH, ItemID, Sender, Subject, Body, MailTemplateID FROM achievement_reward");
1223 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty.");
1229 Field* fields = result->Fetch();
1234 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` contains a wrong achievement ID ({}), ignored.",
id);
1250 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not contain title or item reward data. Ignored.",
id);
1255 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]);
1262 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (Entry: {}) contains an invalid title id ({}) in `title_A`, set to 0",
id, reward.
TitleId[0]);
1272 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (Entry: {}) contains an invalid title id ({}) in `title_H`, set to 0",
id, reward.
TitleId[1]);
1282 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) contains an invalid creature ID {} as sender, mail reward skipped.",
id, reward.
SenderCreatureId);
1289 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);
1292 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but contains a mail subject.",
id);
1294 if (!reward.
Body.empty())
1295 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but contains mail text.",
id);
1298 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) does not have sender data, but has a MailTemplate.",
id);
1305 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) is using an invalid MailTemplate ({}).",
id, reward.
MailTemplateId);
1308 else if (!reward.
Subject.empty() || !reward.
Body.empty())
1309 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward` (ID: {}) is using MailTemplate ({}) and mail subject/text.",
id, reward.
MailTemplateId);
1316 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);
1322 }
while (result->NextRow());
1338 TC_LOG_INFO(
"server.loading",
">> Loaded 0 achievement reward locale strings. DB table `achievement_reward_locale` is empty.");
1344 Field* fields = result->Fetch();
1351 TC_LOG_ERROR(
"sql.sql",
"Table `achievement_reward_locale` (ID: {}) contains locale strings for a non-existing achievement reward.",
id);
1362 }
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__,...)
#define TC_LOG_TRACE(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
#define TC_LOG_INFO(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
Role Based Access Control related classes definition.
if(posix_memalign(&__mallocedMemory, __align, __size)) return NULL
@ 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
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)
void ApplyHotfix(uint32 id, void(*fixer)(T *), bool notifyClient=false)
Class used to access individual fields of database query result.
std::string GetString() const
std::string_view GetStringView() const
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)
static ObjectGuid GetGUID(Object const *o)
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
static Team TeamForRace(uint8 race)
UF::UpdateField< UF::PlayerData, 0, TYPEID_PLAYER > m_playerData
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 setInt64(const uint8 index, const int64 value)
void setUInt32(const uint8 index, const uint32 value)
void setString(const uint8 index, const std::string &value)
void setUInt64(const uint8 index, const 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)
uint32 GetVirtualRealmAddress()
@ 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)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
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