AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
AchievementGlobalMgr Class Reference

#include "AchievementMgr.h"

Public Member Functions

bool IsStatisticCriteria (AchievementCriteriaEntry const *achievementCriteria) const
 
bool IsStatisticAchievement (AchievementEntry const *achievement) const
 
AchievementCriteriaEntryList const * GetAchievementCriteriaByType (AchievementCriteriaTypes type) const
 
AchievementCriteriaEntryList const * GetSpecialAchievementCriteriaByType (AchievementCriteriaTypes type, uint32 val)
 
AchievementCriteriaEntryList const * GetAchievementCriteriaByCondition (AchievementCriteriaCondition condition, uint32 val)
 
AchievementCriteriaEntryList const & GetTimedAchievementCriteriaByType (AchievementCriteriaTimedTypes type) const
 
AchievementCriteriaEntryList const * GetAchievementCriteriaByAchievement (uint32 id) const
 
AchievementEntryList const * GetAchievementByReferencedId (uint32 id) const
 
AchievementReward const * GetAchievementReward (AchievementEntry const *achievement) const
 
AchievementRewardLocale const * GetAchievementRewardLocale (AchievementEntry const *achievement) const
 
AchievementCriteriaDataSet const * GetCriteriaDataSet (AchievementCriteriaEntry const *achievementCriteria) const
 
bool IsRealmCompleted (AchievementEntry const *achievement) const
 
void SetRealmCompleted (AchievementEntry const *achievement)
 
void LoadAchievementCriteriaList ()
 
void LoadAchievementCriteriaData ()
 
void LoadAchievementReferenceList ()
 
void LoadCompletedAchievements ()
 
void LoadRewards ()
 
void LoadRewardLocales ()
 
AchievementEntry const * GetAchievement (uint32 achievementId) const
 

Static Public Member Functions

static AchievementGlobalMgrinstance ()
 

Private Types

typedef std::unordered_map< uint32, SystemTimePointAllCompletedAchievements
 

Private Member Functions

 AchievementGlobalMgr ()=default
 
 ~AchievementGlobalMgr ()=default
 

Private Attributes

AchievementCriteriaDataMap _criteriaDataMap
 
AchievementCriteriaEntryList _achievementCriteriasByType [ACHIEVEMENT_CRITERIA_TYPE_TOTAL]
 
AchievementCriteriaEntryList _achievementCriteriasByTimedType [ACHIEVEMENT_TIMED_TYPE_MAX]
 
AchievementCriteriaListByAchievement _achievementCriteriaListByAchievement
 
AchievementListByReferencedId _achievementListByReferencedId
 
AllCompletedAchievements _allCompletedAchievements
 
AchievementRewards _achievementRewards
 
AchievementRewardLocales _achievementRewardLocales
 
std::map< uint32, AchievementCriteriaEntryList_specialList [ACHIEVEMENT_CRITERIA_TYPE_TOTAL]
 
std::map< uint32, AchievementCriteriaEntryList_achievementCriteriasByCondition [ACHIEVEMENT_CRITERIA_CONDITION_TOTAL]
 

Detailed Description

Member Typedef Documentation

◆ AllCompletedAchievements

Constructor & Destructor Documentation

◆ AchievementGlobalMgr()

AchievementGlobalMgr::AchievementGlobalMgr ( )
privatedefault

◆ ~AchievementGlobalMgr()

AchievementGlobalMgr::~AchievementGlobalMgr ( )
privatedefault

Member Function Documentation

◆ GetAchievement()

AchievementEntry const * AchievementGlobalMgr::GetAchievement ( uint32  achievementId) const
2986{
2987 return sAchievementStore.LookupEntry(achievementId);
2988}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)

References sAchievementStore.

◆ GetAchievementByReferencedId()

AchievementEntryList const * AchievementGlobalMgr::GetAchievementByReferencedId ( uint32  id) const
inline
364 {
365 AchievementListByReferencedId::const_iterator itr = _achievementListByReferencedId.find(id);
366 return itr != _achievementListByReferencedId.end() ? &itr->second : nullptr;
367 }
AchievementListByReferencedId _achievementListByReferencedId
Definition: AchievementMgr.h:408

References _achievementListByReferencedId.

◆ GetAchievementCriteriaByAchievement()

AchievementCriteriaEntryList const * AchievementGlobalMgr::GetAchievementCriteriaByAchievement ( uint32  id) const
inline
358 {
359 AchievementCriteriaListByAchievement::const_iterator itr = _achievementCriteriaListByAchievement.find(id);
360 return itr != _achievementCriteriaListByAchievement.end() ? &itr->second : nullptr;
361 }
AchievementCriteriaListByAchievement _achievementCriteriaListByAchievement
Definition: AchievementMgr.h:406

References _achievementCriteriaListByAchievement.

◆ GetAchievementCriteriaByCondition()

AchievementCriteriaEntryList const * AchievementGlobalMgr::GetAchievementCriteriaByCondition ( AchievementCriteriaCondition  condition,
uint32  val 
)
inline
346 {
347 if (_achievementCriteriasByCondition[condition].find(val) != _achievementCriteriasByCondition[condition].end())
348 return &_achievementCriteriasByCondition[condition][val];
349 return nullptr;
350 }
std::map< uint32, AchievementCriteriaEntryList > _achievementCriteriasByCondition[ACHIEVEMENT_CRITERIA_CONDITION_TOTAL]
Definition: AchievementMgr.h:418

References _achievementCriteriasByCondition.

◆ GetAchievementCriteriaByType()

AchievementCriteriaEntryList const * AchievementGlobalMgr::GetAchievementCriteriaByType ( AchievementCriteriaTypes  type) const
inline
334 {
335 return &_achievementCriteriasByType[type];
336 }
AchievementCriteriaEntryList _achievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL]
Definition: AchievementMgr.h:403

References _achievementCriteriasByType.

◆ GetAchievementReward()

AchievementReward const * AchievementGlobalMgr::GetAchievementReward ( AchievementEntry const *  achievement) const
inline
370 {
371 AchievementRewards::const_iterator iter = _achievementRewards.find(achievement->ID);
372 return iter != _achievementRewards.end() ? &iter->second : nullptr;
373 }
AchievementRewards _achievementRewards
Definition: AchievementMgr.h:413

References _achievementRewards, and AchievementEntry::ID.

◆ GetAchievementRewardLocale()

AchievementRewardLocale const * AchievementGlobalMgr::GetAchievementRewardLocale ( AchievementEntry const *  achievement) const
inline
376 {
377 AchievementRewardLocales::const_iterator iter = _achievementRewardLocales.find(achievement->ID);
378 return iter != _achievementRewardLocales.end() ? &iter->second : nullptr;
379 }
AchievementRewardLocales _achievementRewardLocales
Definition: AchievementMgr.h:414

References _achievementRewardLocales, and AchievementEntry::ID.

◆ GetCriteriaDataSet()

AchievementCriteriaDataSet const * AchievementGlobalMgr::GetCriteriaDataSet ( AchievementCriteriaEntry const *  achievementCriteria) const
inline
382 {
383 AchievementCriteriaDataMap::const_iterator iter = _criteriaDataMap.find(achievementCriteria->ID);
384 return iter != _criteriaDataMap.end() ? &iter->second : nullptr;
385 }
AchievementCriteriaDataMap _criteriaDataMap
Definition: AchievementMgr.h:400

References _criteriaDataMap, and AchievementCriteriaEntry::ID.

Referenced by LoadAchievementCriteriaData().

◆ GetSpecialAchievementCriteriaByType()

AchievementCriteriaEntryList const * AchievementGlobalMgr::GetSpecialAchievementCriteriaByType ( AchievementCriteriaTypes  type,
uint32  val 
)
inline
339 {
340 if (_specialList[type].find(val) != _specialList[type].end())
341 return &_specialList[type][val];
342 return nullptr;
343 }
std::map< uint32, AchievementCriteriaEntryList > _specialList[ACHIEVEMENT_CRITERIA_TYPE_TOTAL]
Definition: AchievementMgr.h:417

References _specialList.

◆ GetTimedAchievementCriteriaByType()

AchievementCriteriaEntryList const & AchievementGlobalMgr::GetTimedAchievementCriteriaByType ( AchievementCriteriaTimedTypes  type) const
inline
353 {
355 }
AchievementCriteriaEntryList _achievementCriteriasByTimedType[ACHIEVEMENT_TIMED_TYPE_MAX]
Definition: AchievementMgr.h:404

References _achievementCriteriasByTimedType.

◆ instance()

AchievementGlobalMgr * AchievementGlobalMgr::instance ( )
static
2398{
2400 return &instance;
2401}
Definition: AchievementMgr.h:323
static AchievementGlobalMgr * instance()
Definition: AchievementMgr.cpp:2397

References instance().

Referenced by instance().

◆ IsRealmCompleted()

bool AchievementGlobalMgr::IsRealmCompleted ( AchievementEntry const *  achievement) const
2432{
2433 auto itr = _allCompletedAchievements.find(achievement->ID);
2434 if (itr == _allCompletedAchievements.end())
2435 return false;
2436
2437 if (itr->second == SystemTimePoint::min())
2438 return false;
2439
2440 if (!sScriptMgr->IsRealmCompleted(this, achievement, itr->second))
2441 return false;
2442
2443 if (itr->second == SystemTimePoint::max())
2444 return true;
2445
2446 // Allow completing the realm first kill for entire minute after first person did it
2447 // it may allow more than one group to achieve it (highly unlikely)
2448 // but apparently this is how blizz handles it as well
2449 if (achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL)
2450 return (GameTime::GetSystemTime() - itr->second) > 1min;
2451
2452 sScriptMgr->SetRealmCompleted(achievement);
2453
2454 return true;
2455}
#define sScriptMgr
Definition: ScriptMgr.h:2702
@ ACHIEVEMENT_FLAG_REALM_FIRST_KILL
Definition: DBCEnums.h:86
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
Definition: GameTime.cpp:48
AllCompletedAchievements _allCompletedAchievements
Definition: AchievementMgr.h:411

References _allCompletedAchievements, ACHIEVEMENT_FLAG_REALM_FIRST_KILL, AchievementEntry::flags, GameTime::GetSystemTime(), AchievementEntry::ID, and sScriptMgr.

Referenced by SetRealmCompleted().

◆ IsStatisticAchievement()

bool AchievementGlobalMgr::IsStatisticAchievement ( AchievementEntry const *  achievement) const
2409{
2410 if (!achievement)
2411 return false;
2412
2413 AchievementCategoryEntry const* cat = sAchievementCategoryStore.LookupEntry(achievement->categoryId);
2414 do
2415 {
2416 switch(cat->ID)
2417 {
2419 return true;
2421 return false;
2422 default:
2423 cat = sAchievementCategoryStore.LookupEntry(cat->parentCategory);
2424 break;
2425 }
2426 } while (cat);
2427
2428 return false;
2429}
@ ACHIEVEMENT_CATEGORY_STATISTICS
Definition: AchievementMgr.h:78
@ ACHIEVEMENT_CATEOGRY_GENERAL
Definition: AchievementMgr.h:77
DBCStorage< AchievementCategoryEntry > sAchievementCategoryStore(AchievementCategoryfmt)
Definition: DBCStructure.h:61
int32 ID
Definition: DBCStructure.h:62
int32 parentCategory
Definition: DBCStructure.h:63

References ACHIEVEMENT_CATEGORY_STATISTICS, ACHIEVEMENT_CATEOGRY_GENERAL, AchievementEntry::categoryId, AchievementCategoryEntry::ID, AchievementCategoryEntry::parentCategory, and sAchievementCategoryStore.

Referenced by IsStatisticCriteria().

◆ IsStatisticCriteria()

bool AchievementGlobalMgr::IsStatisticCriteria ( AchievementCriteriaEntry const *  achievementCriteria) const
2404{
2405 return IsStatisticAchievement(sAchievementStore.LookupEntry(achievementCriteria->referredAchievement));
2406}
bool IsStatisticAchievement(AchievementEntry const *achievement) const
Definition: AchievementMgr.cpp:2408

References IsStatisticAchievement(), AchievementCriteriaEntry::referredAchievement, and sAchievementStore.

◆ LoadAchievementCriteriaData()

void AchievementGlobalMgr::LoadAchievementCriteriaData ( )
2643{
2644 uint32 oldMSTime = getMSTime();
2645
2646 _criteriaDataMap.clear(); // need for reload case
2647
2648 QueryResult result = WorldDatabase.Query("SELECT criteria_id, type, value1, value2, ScriptName FROM achievement_criteria_data");
2649
2650 if (!result)
2651 {
2652 LOG_WARN("server.loading", ">> Loaded 0 additional achievement criteria data. DB table `achievement_criteria_data` is empty.");
2653 LOG_INFO("server.loading", " ");
2654 return;
2655 }
2656
2657 uint32 count = 0;
2658
2659 do
2660 {
2661 Field* fields = result->Fetch();
2662 uint32 criteria_id = fields[0].Get<uint32>();
2663
2664 AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(criteria_id);
2665
2666 if (!criteria)
2667 {
2668 LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has data for non-existing criteria (Entry: {}), ignore.", criteria_id);
2669 continue;
2670 }
2671
2672 uint32 dataType = fields[1].Get<uint8>();
2673 std::string scriptName = fields[4].Get<std::string>();
2674 uint32 scriptId = 0;
2675 if (scriptName.length()) // not empty
2676 {
2678 LOG_ERROR("sql.sql", "Table `achievement_criteria_data` has ScriptName set for non-scripted data type (Entry: {}, type {}), useless data.", criteria_id, dataType);
2679 else
2680 scriptId = sObjectMgr->GetScriptId(scriptName.c_str());
2681 }
2682
2683 AchievementCriteriaData data(dataType, fields[2].Get<uint32>(), fields[3].Get<uint32>(), scriptId);
2684
2685 if (!data.IsValid(criteria))
2686 continue;
2687
2688 // this will allocate empty data set storage
2689 AchievementCriteriaDataSet& dataSet = _criteriaDataMap[criteria_id];
2690 dataSet.SetCriteriaId(criteria_id);
2691
2692 // add real data only for not NONE data types
2693 if (data.dataType != ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE)
2694 dataSet.Add(data);
2695
2696 // counting data by and data types
2697 ++count;
2698 } while (result->NextRow());
2699
2700 // post loading checks
2701 for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId)
2702 {
2703 AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
2704 if (!criteria)
2705 continue;
2706
2707 switch (criteria->requiredType)
2708 {
2725 // achievement requires db data
2726 break;
2728 {
2729 AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
2730 if (!achievement)
2731 continue;
2732
2733 // exist many achievements with this criteria, use at this moment hardcoded check to skil simple case
2734 if (achievement->ID == 1282)
2735 break;
2736
2737 continue;
2738 }
2739 case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA: // need skip generic cases
2741 continue;
2742 break;
2743 case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE: // need skip generic cases
2744 if (criteria->do_emote.count == 0)
2745 continue;
2746 break;
2747 case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL: // skip statistics
2748 if (criteria->win_duel.duelCount == 0)
2749 continue;
2750 break;
2751 case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE: // need skip generic cases
2752 if (criteria->loot_type.lootTypeCount != 1)
2753 continue;
2754 break;
2756 case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM: // only Children's Week achievements
2757 {
2758 AchievementEntry const* achievement = sAchievementStore.LookupEntry(criteria->referredAchievement);
2759 if (!achievement)
2760 continue;
2761 if (achievement->categoryId != CATEGORY_CHILDRENS_WEEK)
2762 continue;
2763 break;
2764 }
2765 default: // type not use DB data, ignore
2766 continue;
2767 }
2768
2770 LOG_ERROR("sql.sql", "Table `achievement_criteria_data` does not have expected data for criteria (Entry: {} Type: {}) for achievement {}.", criteria->ID, criteria->requiredType, criteria->referredAchievement);
2771 }
2772
2773 LOG_INFO("server.loading", ">> Loaded {} additional achievement criteria data in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2774 LOG_INFO("server.loading", " ");
2775}
std::uint8_t uint8
Definition: Define.h:110
std::uint32_t uint32
Definition: Define.h:108
#define LOG_INFO(filterType__,...)
Definition: Log.h:167
#define LOG_ERROR(filterType__,...)
Definition: Log.h:159
#define LOG_WARN(filterType__,...)
Definition: Log.h:163
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
uint32 getMSTime()
Definition: Timer.h:103
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:28
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT
Definition: AchievementMgr.h:57
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE
Definition: AchievementMgr.h:46
@ DISABLE_TYPE_ACHIEVEMENT_CRITERIA
Definition: DisableMgr.h:33
DBCStorage< AchievementCriteriaEntry > sAchievementCriteriaStore(AchievementCriteriafmt)
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE
Definition: DBCEnums.h:97
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE
Definition: DBCEnums.h:222
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2
Definition: DBCEnums.h:187
@ ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM
Definition: DBCEnums.h:161
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition: DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition: DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL
Definition: DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition: DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT
Definition: DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE
Definition: DBCEnums.h:174
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE
Definition: DBCEnums.h:194
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition: DBCEnums.h:155
@ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2
Definition: DBCEnums.h:223
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition: DBCEnums.h:147
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
Definition: DBCEnums.h:157
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition: DBCEnums.h:169
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition: DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition: DBCEnums.h:192
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_BG
Definition: DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition: DBCEnums.h:188
@ ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
Definition: DBCEnums.h:150
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition: DBCEnums.h:176
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT
Definition: DBCEnums.h:170
@ ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN
Definition: DBCEnums.h:190
@ CATEGORY_CHILDRENS_WEEK
Definition: DBCEnums.h:234
bool IsDisabledFor(DisableType type, uint32 entry, Unit const *unit, uint8 flags)
Definition: DisableMgr.cpp:306
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Definition: AchievementMgr.h:85
Definition: AchievementMgr.h:233
void Add(AchievementCriteriaData const &data)
Definition: AchievementMgr.h:236
void SetCriteriaId(uint32 id)
Definition: AchievementMgr.h:238
AchievementCriteriaDataSet const * GetCriteriaDataSet(AchievementCriteriaEntry const *achievementCriteria) const
Definition: AchievementMgr.h:381
Definition: DBCStructure.h:40
uint32 categoryId
Definition: DBCStructure.h:49
uint32 ID
Definition: DBCStructure.h:41
Definition: DBCStructure.h:70
struct AchievementCriteriaEntry::@293::@338 do_emote
struct AchievementCriteriaEntry::@293::@348 win_duel
uint32 lootTypeCount
Definition: DBCStructure.h:471
struct AchievementCriteriaEntry::@295 additionalRequirements[MAX_CRITERIA_REQUIREMENTS]
uint32 count
Definition: DBCStructure.h:223
uint32 duelCount
Definition: DBCStructure.h:440
uint32 ID
Definition: DBCStructure.h:71
uint32 requiredType
Definition: DBCStructure.h:73
uint32 additionalRequirement_type
Definition: DBCStructure.h:503
uint32 referredAchievement
Definition: DBCStructure.h:72
struct AchievementCriteriaEntry::@293::@353 loot_type

References _criteriaDataMap, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE, ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE, ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, AchievementCriteriaDataSet::Add(), AchievementCriteriaEntry::additionalRequirement_type, AchievementCriteriaEntry::additionalRequirements, CATEGORY_CHILDRENS_WEEK, AchievementEntry::categoryId, AchievementCriteriaEntry::count, AchievementCriteriaData::dataType, DISABLE_TYPE_ACHIEVEMENT_CRITERIA, AchievementCriteriaEntry::do_emote, AchievementCriteriaEntry::duelCount, Field::Get(), GetCriteriaDataSet(), getMSTime(), GetMSTimeDiffToNow(), AchievementEntry::ID, AchievementCriteriaEntry::ID, DisableMgr::IsDisabledFor(), AchievementCriteriaData::IsValid(), LOG_ERROR, LOG_INFO, LOG_WARN, AchievementCriteriaEntry::loot_type, AchievementCriteriaEntry::lootTypeCount, AchievementCriteriaEntry::referredAchievement, AchievementCriteriaEntry::requiredType, sAchievementCriteriaStore, sAchievementStore, AchievementCriteriaDataSet::SetCriteriaId(), sObjectMgr, AchievementCriteriaEntry::win_duel, and WorldDatabase.

◆ LoadAchievementCriteriaList()

void AchievementGlobalMgr::LoadAchievementCriteriaList ( )
2467{
2468 uint32 oldMSTime = getMSTime();
2469
2470 if (sAchievementCriteriaStore.GetNumRows() == 0)
2471 {
2472 LOG_WARN("server.loading", ">> Loaded 0 achievement criteria.");
2473 LOG_INFO("server.loading", " ");
2474 return;
2475 }
2476
2477 uint32 loaded = 0;
2478 for (uint32 entryId = 0; entryId < sAchievementCriteriaStore.GetNumRows(); ++entryId)
2479 {
2480 AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(entryId);
2481 if (!criteria)
2482 continue;
2483
2484 _achievementCriteriasByType[criteria->requiredType].push_back(criteria);
2485 _achievementCriteriaListByAchievement[criteria->referredAchievement].push_back(criteria);
2486
2492
2493 switch (criteria->requiredType)
2494 {
2496 _specialList[criteria->requiredType][criteria->kill_creature.creatureID].push_back(criteria);
2497 break;
2499 _specialList[criteria->requiredType][criteria->win_bg.bgMapID].push_back(criteria);
2500 break;
2502 _specialList[criteria->requiredType][criteria->reach_skill_level.skillID].push_back(criteria);
2503 break;
2505 _specialList[criteria->requiredType][criteria->complete_achievement.linkedAchievement].push_back(criteria);
2506 break;
2508 _specialList[criteria->requiredType][criteria->complete_quests_in_zone.zoneID].push_back(criteria);
2509 break;
2511 _specialList[criteria->requiredType][criteria->complete_battleground.mapID].push_back(criteria);
2512 break;
2514 _specialList[criteria->requiredType][criteria->killed_by_creature.creatureEntry].push_back(criteria);
2515 break;
2517 _specialList[criteria->requiredType][criteria->complete_quest.questID].push_back(criteria);
2518 break;
2520 _specialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
2521 break;
2523 _specialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
2524 break;
2526 _specialList[criteria->requiredType][criteria->bg_objective.objectiveId].push_back(criteria);
2527 break;
2529 _specialList[criteria->requiredType][criteria->honorable_kill_at_area.areaID].push_back(criteria);
2530 break;
2532 _specialList[criteria->requiredType][criteria->learn_spell.spellID].push_back(criteria);
2533 break;
2535 _specialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
2536 break;
2538 _specialList[criteria->requiredType][criteria->learn_skill_level.skillID].push_back(criteria);
2539 break;
2541 _specialList[criteria->requiredType][criteria->use_item.itemID].push_back(criteria);
2542 break;
2544 _specialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
2545 break;
2547 {
2548 WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(criteria->explore_area.areaReference);
2549 if (!worldOverlayEntry)
2550 break;
2551
2552 for (uint8 j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
2553 if (worldOverlayEntry->areatableID[j])
2554 {
2555 bool valid = true;
2556 for (uint8 i = 0; i < j; ++i)
2557 if (worldOverlayEntry->areatableID[j] == worldOverlayEntry->areatableID[i])
2558 valid = false;
2559 if (valid)
2560 _specialList[criteria->requiredType][worldOverlayEntry->areatableID[j]].push_back(criteria);
2561 }
2562 }
2563 break;
2565 _specialList[criteria->requiredType][criteria->gain_reputation.factionID].push_back(criteria);
2566 break;
2568 _specialList[criteria->requiredType][criteria->equip_epic_item.itemSlot].push_back(criteria);
2569 break;
2571 _specialList[criteria->requiredType][criteria->hk_class.classID].push_back(criteria);
2572 break;
2574 _specialList[criteria->requiredType][criteria->hk_race.raceID].push_back(criteria);
2575 break;
2577 _specialList[criteria->requiredType][criteria->do_emote.emoteID].push_back(criteria);
2578 break;
2580 _specialList[criteria->requiredType][criteria->equip_item.itemID].push_back(criteria);
2581 break;
2583 _specialList[criteria->requiredType][criteria->use_gameobject.goEntry].push_back(criteria);
2584 break;
2586 _specialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
2587 break;
2589 _specialList[criteria->requiredType][criteria->fish_in_gameobject.goEntry].push_back(criteria);
2590 break;
2592 _specialList[criteria->requiredType][criteria->learn_skillline_spell.skillLine].push_back(criteria);
2593 break;
2595 _specialList[criteria->requiredType][criteria->loot_type.lootType].push_back(criteria);
2596 break;
2598 _specialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
2599 break;
2601 _specialList[criteria->requiredType][criteria->learn_skill_line.skillLine].push_back(criteria);
2602 break;
2603 }
2604
2605 if (criteria->timeLimit)
2606 _achievementCriteriasByTimedType[criteria->timedType].push_back(criteria);
2607
2608 ++loaded;
2609 }
2610
2611 LOG_INFO("server.loading", ">> Loaded {} achievement criteria in {} ms", loaded, GetMSTimeDiffToNow(oldMSTime));
2612 LOG_INFO("server.loading", " ");
2613}
DBCStorage< WorldMapOverlayEntry > sWorldMapOverlayStore(WorldMapOverlayEntryfmt)
@ ACHIEVEMENT_CRITERIA_CONDITION_NONE
Definition: DBCEnums.h:93
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition: DBCEnums.h:135
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition: DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition: DBCEnums.h:177
@ ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT
Definition: DBCEnums.h:189
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM
Definition: DBCEnums.h:162
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND
Definition: DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT
Definition: DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition: DBCEnums.h:156
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition: DBCEnums.h:154
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition: DBCEnums.h:191
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT
Definition: DBCEnums.h:132
@ ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION
Definition: DBCEnums.h:166
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition: DBCEnums.h:224
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition: DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition: DBCEnums.h:163
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition: DBCEnums.h:160
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition: DBCEnums.h:143
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition: DBCEnums.h:151
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition: DBCEnums.h:172
#define MAX_WORLD_MAP_OVERLAY_AREA_IDX
Definition: DBCStructure.h:2138
struct AchievementCriteriaEntry::@293::@305 complete_battleground
struct AchievementCriteriaEntry::@293::@337 hk_race
uint32 timeLimit
Definition: DBCStructure.h:514
uint32 areaReference
Definition: DBCStructure.h:290
struct AchievementCriteriaEntry::@293::@303 complete_quests_in_zone
uint32 creatureEntry
Definition: DBCStructure.h:166
struct AchievementCriteriaEntry::@293::@330 gain_reputation
uint32 skillLine
Definition: DBCStructure.h:432
struct AchievementCriteriaEntry::@293::@344 use_gameobject
uint32 objectiveId
Definition: DBCStructure.h:208
uint32 timedType
Definition: DBCStructure.h:510
uint32 bgMapID
Definition: DBCStructure.h:87
struct AchievementCriteriaEntry::@293::@312 complete_quest
uint32 zoneID
Definition: DBCStructure.h:128
uint32 itemID
Definition: DBCStructure.h:241
uint32 mapID
Definition: DBCStructure.h:142
struct AchievementCriteriaEntry::@293::@325 use_item
struct AchievementCriteriaEntry::@293::@319 learn_spell
uint32 spellID
Definition: DBCStructure.h:193
struct AchievementCriteriaEntry::@293::@341 equip_item
struct AchievementCriteriaEntry::@293::@309 killed_by_creature
uint32 goEntry
Definition: DBCStructure.h:410
uint32 emoteID
Definition: DBCStructure.h:367
uint32 skillID
Definition: DBCStructure.h:101
struct AchievementCriteriaEntry::@293::@333 equip_epic_item
uint32 classID
Definition: DBCStructure.h:352
uint32 lootType
Definition: DBCStructure.h:470
uint32 itemSlot
Definition: DBCStructure.h:332
uint32 questID
Definition: DBCStructure.h:185
struct AchievementCriteriaEntry::@293::@327 explore_area
struct AchievementCriteriaEntry::@293::@324 learn_skill_level
struct AchievementCriteriaEntry::@293::@336 hk_class
uint32 raceID
Definition: DBCStructure.h:359
struct AchievementCriteriaEntry::@293::@320 own_item
struct AchievementCriteriaEntry::@293::@313 be_spell_target
uint32 additionalRequirement_value
Definition: DBCStructure.h:504
uint32 linkedAchievement
Definition: DBCStructure.h:108
struct AchievementCriteriaEntry::@293::@299 reach_skill_level
struct AchievementCriteriaEntry::@293::@347 learn_skillline_spell
uint32 areaID
Definition: DBCStructure.h:215
uint32 creatureID
Definition: DBCStructure.h:80
struct AchievementCriteriaEntry::@293::@354 learn_skill_line
struct AchievementCriteriaEntry::@293::@315 bg_objective
struct AchievementCriteriaEntry::@293::@296 kill_creature
struct AchievementCriteriaEntry::@293::@316 honorable_kill_at_area
uint32 factionID
Definition: DBCStructure.h:310
struct AchievementCriteriaEntry::@293::@314 cast_spell
struct AchievementCriteriaEntry::@293::@346 fish_in_gameobject
struct AchievementCriteriaEntry::@293::@300 complete_achievement
struct AchievementCriteriaEntry::@293::@297 win_bg
Definition: DBCStructure.h:2141
uint32 areatableID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]
Definition: DBCStructure.h:2144

References _achievementCriteriaListByAchievement, _achievementCriteriasByCondition, _achievementCriteriasByTimedType, _achievementCriteriasByType, _specialList, ACHIEVEMENT_CRITERIA_CONDITION_NONE, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, AchievementCriteriaEntry::additionalRequirement_type, AchievementCriteriaEntry::additionalRequirement_value, AchievementCriteriaEntry::additionalRequirements, AchievementCriteriaEntry::areaID, AchievementCriteriaEntry::areaReference, WorldMapOverlayEntry::areatableID, AchievementCriteriaEntry::be_spell_target, AchievementCriteriaEntry::bg_objective, AchievementCriteriaEntry::bgMapID, AchievementCriteriaEntry::cast_spell, AchievementCriteriaEntry::classID, AchievementCriteriaEntry::complete_achievement, AchievementCriteriaEntry::complete_battleground, AchievementCriteriaEntry::complete_quest, AchievementCriteriaEntry::complete_quests_in_zone, AchievementCriteriaEntry::creatureEntry, AchievementCriteriaEntry::creatureID, AchievementCriteriaEntry::do_emote, AchievementCriteriaEntry::emoteID, AchievementCriteriaEntry::equip_epic_item, AchievementCriteriaEntry::equip_item, AchievementCriteriaEntry::explore_area, AchievementCriteriaEntry::factionID, AchievementCriteriaEntry::fish_in_gameobject, AchievementCriteriaEntry::gain_reputation, getMSTime(), GetMSTimeDiffToNow(), AchievementCriteriaEntry::goEntry, AchievementCriteriaEntry::hk_class, AchievementCriteriaEntry::hk_race, AchievementCriteriaEntry::honorable_kill_at_area, AchievementCriteriaEntry::itemID, AchievementCriteriaEntry::itemSlot, AchievementCriteriaEntry::kill_creature, AchievementCriteriaEntry::killed_by_creature, AchievementCriteriaEntry::learn_skill_level, AchievementCriteriaEntry::learn_skill_line, AchievementCriteriaEntry::learn_skillline_spell, AchievementCriteriaEntry::learn_spell, AchievementCriteriaEntry::linkedAchievement, LOG_INFO, LOG_WARN, AchievementCriteriaEntry::loot_type, AchievementCriteriaEntry::lootType, AchievementCriteriaEntry::mapID, MAX_WORLD_MAP_OVERLAY_AREA_IDX, AchievementCriteriaEntry::objectiveId, AchievementCriteriaEntry::own_item, AchievementCriteriaEntry::questID, AchievementCriteriaEntry::raceID, AchievementCriteriaEntry::reach_skill_level, AchievementCriteriaEntry::referredAchievement, AchievementCriteriaEntry::requiredType, sAchievementCriteriaStore, AchievementCriteriaEntry::skillID, AchievementCriteriaEntry::skillLine, AchievementCriteriaEntry::spellID, sWorldMapOverlayStore, AchievementCriteriaEntry::timedType, AchievementCriteriaEntry::timeLimit, AchievementCriteriaEntry::use_gameobject, AchievementCriteriaEntry::use_item, AchievementCriteriaEntry::win_bg, and AchievementCriteriaEntry::zoneID.

◆ LoadAchievementReferenceList()

void AchievementGlobalMgr::LoadAchievementReferenceList ( )
2616{
2617 uint32 oldMSTime = getMSTime();
2618
2619 if (sAchievementStore.GetNumRows() == 0)
2620 {
2621 LOG_WARN("server.loading", ">> Loaded 0 achievement references.");
2622 LOG_INFO("server.loading", " ");
2623 return;
2624 }
2625
2626 uint32 count = 0;
2627
2628 for (uint32 entryId = 0; entryId < sAchievementStore.GetNumRows(); ++entryId)
2629 {
2630 AchievementEntry const* achievement = sAchievementStore.LookupEntry(entryId);
2631 if (!achievement || !achievement->refAchievement)
2632 continue;
2633
2634 _achievementListByReferencedId[achievement->refAchievement].push_back(achievement);
2635 ++count;
2636 }
2637
2638 LOG_INFO("server.loading", ">> Loaded {} achievement references in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2639 LOG_INFO("server.loading", " ");
2640}
uint32 refAchievement
Definition: DBCStructure.h:57

References _achievementListByReferencedId, getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, AchievementEntry::refAchievement, and sAchievementStore.

◆ LoadCompletedAchievements()

void AchievementGlobalMgr::LoadCompletedAchievements ( )
2778{
2779 uint32 oldMSTime = getMSTime();
2780
2781 QueryResult result = CharacterDatabase.Query("SELECT achievement FROM character_achievement GROUP BY achievement");
2782
2783 // Populate _allCompletedAchievements with all realm first achievement ids to make multithreaded access safer
2784 // while it will not prevent races, it will prevent crashes that happen because std::unordered_map key was added
2785 // instead the only potential race will happen on value associated with the key
2786 for (uint32 i = 0; i < sAchievementStore.GetNumRows(); ++i)
2787 if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(i))
2789 _allCompletedAchievements[achievement->ID] = SystemTimePoint::min();
2790
2791 if (!result)
2792 {
2793 LOG_WARN("server.loading", ">> Loaded 0 completed achievements. DB table `character_achievement` is empty.");
2794 LOG_INFO("server.loading", " ");
2795 return;
2796 }
2797
2798 do
2799 {
2800 Field* fields = result->Fetch();
2801
2802 uint16 achievementId = fields[0].Get<uint16>();
2803 const AchievementEntry* achievement = sAchievementStore.LookupEntry(achievementId);
2804 if (!achievement)
2805 {
2806 // Remove non existent achievements from all characters
2807 LOG_ERROR("achievement", "Non-existing achievement {} data removed from table `character_achievement`.", achievementId);
2808
2810
2811 stmt->SetData(0, uint16(achievementId));
2812 CharacterDatabase.Execute(stmt);
2813
2814 continue;
2815 }
2817 _allCompletedAchievements[achievementId] = SystemTimePoint::max();
2818 } while (result->NextRow());
2819
2820 LOG_INFO("server.loading", ">> Loaded {} completed achievements in {} ms", (unsigned long)_allCompletedAchievements.size(), GetMSTimeDiffToNow(oldMSTime));
2821 LOG_INFO("server.loading", " ");
2822}
std::uint16_t uint16
Definition: Define.h:109
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition: DatabaseEnv.cpp:21
@ CHAR_DEL_INVALID_ACHIEVMENT
Definition: CharacterDatabase.h:298
@ ACHIEVEMENT_FLAG_REALM_FIRST_REACH
Definition: DBCEnums.h:85
Definition: PreparedStatement.h:158
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78

References _allCompletedAchievements, ACHIEVEMENT_FLAG_REALM_FIRST_KILL, ACHIEVEMENT_FLAG_REALM_FIRST_REACH, CHAR_DEL_INVALID_ACHIEVMENT, CharacterDatabase, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_ERROR, LOG_INFO, LOG_WARN, sAchievementStore, and PreparedStatementBase::SetData().

◆ LoadRewardLocales()

void AchievementGlobalMgr::LoadRewardLocales ( )
2946{
2947 uint32 oldMSTime = getMSTime();
2948
2949 _achievementRewardLocales.clear(); // need for reload case
2950
2951 // 0 1 2 3
2952 QueryResult result = WorldDatabase.Query("SELECT ID, Locale, Subject, Text FROM achievement_reward_locale");
2953
2954 if (!result)
2955 {
2956 LOG_WARN("server.loading", ">> Loaded 0 achievement reward locale strings. DB table `achievement_reward_locale` is empty");
2957 LOG_INFO("server.loading", " ");
2958 return;
2959 }
2960
2961 do
2962 {
2963 Field* fields = result->Fetch();
2964
2965 uint32 ID = fields[0].Get<uint32>();
2966 if (_achievementRewards.find(ID) == _achievementRewards.end())
2967 {
2968 LOG_ERROR("sql.sql", "Table `achievement_reward_locale` (Entry: {}) has locale strings for non-existing achievement reward.", ID);
2969 continue;
2970 }
2971
2972 LocaleConstant locale = GetLocaleByName(fields[1].Get<std::string>());
2973 if (locale == LOCALE_enUS)
2974 continue;
2975
2977 ObjectMgr::AddLocaleString(fields[2].Get<std::string>(), locale, data.Subject);
2978 ObjectMgr::AddLocaleString(fields[3].Get<std::string>(), locale, data.Text);
2979 } while (result->NextRow());
2980
2981 LOG_INFO("server.loading", ">> Loaded {} Achievement Reward Locale Strings in {} ms", (unsigned long)_achievementRewardLocales.size(), GetMSTimeDiffToNow(oldMSTime));
2982 LOG_INFO("server.loading", " ");
2983}
LocaleConstant GetLocaleByName(const std::string &name)
Definition: Common.cpp:33
LocaleConstant
Definition: Common.h:74
@ LOCALE_enUS
Definition: Common.h:75
Definition: AchievementMgr.h:259
std::vector< std::string > Text
Definition: AchievementMgr.h:261
std::vector< std::string > Subject
Definition: AchievementMgr.h:260
static void AddLocaleString(std::string &&s, LocaleConstant locale, std::vector< std::string > &data)
Definition: ObjectMgr.cpp:438

References _achievementRewardLocales, _achievementRewards, ObjectMgr::AddLocaleString(), Field::Get(), GetLocaleByName(), getMSTime(), GetMSTimeDiffToNow(), LOCALE_enUS, LOG_ERROR, LOG_INFO, LOG_WARN, AchievementRewardLocale::Subject, AchievementRewardLocale::Text, and WorldDatabase.

◆ LoadRewards()

void AchievementGlobalMgr::LoadRewards ( )
2825{
2826 uint32 oldMSTime = getMSTime();
2827
2828 _achievementRewards.clear(); // need for reload case
2829
2830 // 0 1 2 3 4 5 6 7
2831 QueryResult result = WorldDatabase.Query("SELECT ID, TitleA, TitleH, ItemID, Sender, Subject, Body, MailTemplateID FROM achievement_reward");
2832
2833 if (!result)
2834 {
2835 LOG_WARN("server.loading", ">> Loaded 0 achievement rewards. DB table `achievement_reward` is empty.");
2836 LOG_INFO("server.loading", " ");
2837 return;
2838 }
2839
2840 uint32 count = 0;
2841
2842 do
2843 {
2844 Field* fields = result->Fetch();
2845 uint32 entry = fields[0].Get<uint32>();
2846 AchievementEntry const* achievement = sAchievementStore.LookupEntry(entry);
2847 if (!achievement)
2848 {
2849 LOG_ERROR("sql.sql", "Table `achievement_reward` has wrong achievement (Entry: {}). Ignoring.", entry);
2850 continue;
2851 }
2852
2853 AchievementReward reward;
2854 reward.titleId[0] = fields[1].Get<uint32>(); // Alliance title
2855 reward.titleId[1] = fields[2].Get<uint32>(); // Horde title
2856 reward.itemId = fields[3].Get<uint32>();
2857 reward.sender = fields[4].Get<uint32>(); // The sender of the mail (a creature from creature_template)
2858 reward.subject = fields[5].Get<std::string>();
2859 reward.text = fields[6].Get<std::string>(); // Body in DB
2860 reward.mailTemplate = fields[7].Get<uint32>();
2861
2862 // Must reward a title or send a mail else, skip it.
2863 if (!reward.titleId[0] && !reward.titleId[1] && !reward.sender)
2864 {
2865 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) does not have any title or item reward data. Ignoring.", entry);
2866 continue;
2867 }
2868
2869 if (achievement->requiredFaction == ACHIEVEMENT_FACTION_ANY && (!reward.titleId[0] ^ !reward.titleId[1]))
2870 LOG_DEBUG("achievement", "Table `achievement_reward` (Entry: {}) has title (A: {} H: {}) set for only one team.", entry, reward.titleId[0], reward.titleId[1]);
2871
2872 if (reward.titleId[0])
2873 {
2874 CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[0]);
2875 if (!titleEntry)
2876 {
2877 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has invalid title id ({}) in `title_A`. Setting it to 0.", entry, reward.titleId[0]);
2878 reward.titleId[0] = 0;
2879 }
2880 }
2881
2882 if (reward.titleId[1])
2883 {
2884 CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(reward.titleId[1]);
2885 if (!titleEntry)
2886 {
2887 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has invalid title id ({}) in `title_H`. Setting it to 0.", entry, reward.titleId[1]);
2888 reward.titleId[1] = 0;
2889 }
2890 }
2891
2892 // Check mail data before item for report including wrong item case
2893 if (reward.sender)
2894 {
2895 if (!sObjectMgr->GetCreatureTemplate(reward.sender))
2896 {
2897 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has invalid creature_template entry {} as Sender. Will not send the mail reward.", entry, reward.sender);
2898 reward.sender = 0;
2899 }
2900 }
2901 else
2902 {
2903 if (reward.itemId)
2904 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has itemId reward set but does not have Sender data set. Item will not be sent.", entry);
2905
2906 if (!reward.subject.empty())
2907 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has mail Subject but does not have Sender data set.", entry); // Maybe add "Mail will not be sent." ?
2908
2909 if (!reward.text.empty())
2910 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has mail text (Body) set but does not have Sender data set.", entry); // Maybe add "Mail will not be sent." ?
2911
2912 if (reward.mailTemplate)
2913 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has mailTemplate set does not have Sender data set.", entry); // Maybe add "Mail will not be sent." ?
2914 }
2915
2916 if (reward.mailTemplate)
2917 {
2918 if (!sMailTemplateStore.LookupEntry(reward.mailTemplate))
2919 {
2920 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has invalid mailTemplate ({}) (check the DBC).", entry, reward.mailTemplate);
2921 reward.mailTemplate = 0;
2922 }
2923 else if (!reward.subject.empty() || !reward.text.empty())
2924 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has mailTemplate ({}) and mail Subject/Body. To use the column mailTemplate, Subject and Body must be empty.", entry, reward.mailTemplate);
2925 }
2926
2927 if (reward.itemId)
2928 {
2929 if (!sObjectMgr->GetItemTemplate(reward.itemId))
2930 {
2931 // Not sure it's an error, it's probably an outDebug instead, because we can simply send a mail with no reward, right?
2932 LOG_ERROR("sql.sql", "Table `achievement_reward` (Entry: {}) has invalid item_template id {}. Reward mail will not contain any item.", entry, reward.itemId);
2933 reward.itemId = 0;
2934 }
2935 }
2936
2937 _achievementRewards[entry] = reward;
2938 ++count;
2939 } while (result->NextRow());
2940
2941 LOG_INFO("server.loading", ">> Loaded {} achievement rewards in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
2942 LOG_INFO("server.loading", " ");
2943}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:171
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
@ ACHIEVEMENT_FACTION_ANY
Definition: DBCEnums.h:72
Definition: AchievementMgr.h:247
std::string subject
Definition: AchievementMgr.h:251
std::string text
Definition: AchievementMgr.h:252
uint32 titleId[2]
Definition: AchievementMgr.h:248
uint32 sender
Definition: AchievementMgr.h:250
uint32 mailTemplate
Definition: AchievementMgr.h:253
uint32 itemId
Definition: AchievementMgr.h:249
Definition: DBCStructure.h:632

References _achievementRewards, ACHIEVEMENT_FACTION_ANY, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), AchievementReward::itemId, LOG_DEBUG, LOG_ERROR, LOG_INFO, LOG_WARN, AchievementReward::mailTemplate, sAchievementStore, sCharTitlesStore, AchievementReward::sender, sMailTemplateStore, sObjectMgr, AchievementReward::subject, AchievementReward::text, AchievementReward::titleId, and WorldDatabase.

◆ SetRealmCompleted()

void AchievementGlobalMgr::SetRealmCompleted ( AchievementEntry const *  achievement)
2458{
2459 if (IsRealmCompleted(achievement))
2460 return;
2461
2463}
bool IsRealmCompleted(AchievementEntry const *achievement) const
Definition: AchievementMgr.cpp:2431

References _allCompletedAchievements, GameTime::GetSystemTime(), AchievementEntry::ID, and IsRealmCompleted().

Member Data Documentation

◆ _achievementCriteriaListByAchievement

AchievementCriteriaListByAchievement AchievementGlobalMgr::_achievementCriteriaListByAchievement
private

◆ _achievementCriteriasByCondition

std::map<uint32, AchievementCriteriaEntryList> AchievementGlobalMgr::_achievementCriteriasByCondition[ACHIEVEMENT_CRITERIA_CONDITION_TOTAL]
private

◆ _achievementCriteriasByTimedType

AchievementCriteriaEntryList AchievementGlobalMgr::_achievementCriteriasByTimedType[ACHIEVEMENT_TIMED_TYPE_MAX]
private

◆ _achievementCriteriasByType

AchievementCriteriaEntryList AchievementGlobalMgr::_achievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL]
private

◆ _achievementListByReferencedId

AchievementListByReferencedId AchievementGlobalMgr::_achievementListByReferencedId
private

◆ _achievementRewardLocales

AchievementRewardLocales AchievementGlobalMgr::_achievementRewardLocales
private

◆ _achievementRewards

AchievementRewards AchievementGlobalMgr::_achievementRewards
private

◆ _allCompletedAchievements

AllCompletedAchievements AchievementGlobalMgr::_allCompletedAchievements
private

◆ _criteriaDataMap

AchievementCriteriaDataMap AchievementGlobalMgr::_criteriaDataMap
private

◆ _specialList