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

#include "AchievementMgr.h"

Public Member Functions

 AchievementMgr (Player *player)
 
 ~AchievementMgr ()
 
void Reset ()
 
void LoadFromDB (PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult)
 
void SaveToDB (CharacterDatabaseTransaction trans)
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void CompletedAchievement (AchievementEntry const *entry)
 
void CheckAllAchievementCriteria ()
 
void SendAllAchievementData () const
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
PlayerGetPlayer () const
 
void Update (uint32 timeDiff)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void RemoveCriteriaProgress (AchievementCriteriaEntry const *entry)
 
CriteriaProgressGetCriteriaProgress (AchievementCriteriaEntry const *entry)
 
CompletedAchievementMap const & GetCompletedAchievements ()
 

Static Public Member Functions

static void DeleteFromDB (ObjectGuid::LowType lowguid)
 

Private Types

enum  ProgressType {
  PROGRESS_SET ,
  PROGRESS_ACCUMULATE ,
  PROGRESS_HIGHEST ,
  PROGRESS_RESET
}
 
typedef std::map< uint32, uint32TimedAchievementMap
 

Private Member Functions

void SendAchievementEarned (AchievementEntry const *achievement) const
 
void SendCriteriaUpdate (AchievementCriteriaEntry const *entry, CriteriaProgress const *progress, uint32 timeElapsed, bool timedCompleted) const
 
void SetCriteriaProgress (AchievementCriteriaEntry const *entry, uint32 changeValue, ProgressType ptype=PROGRESS_SET)
 
void CompletedCriteriaFor (AchievementEntry const *achievement)
 
bool IsCompletedCriteria (AchievementCriteriaEntry const *achievementCriteria, AchievementEntry const *achievement)
 
bool IsCompletedAchievement (AchievementEntry const *entry)
 
bool CanUpdateCriteria (AchievementCriteriaEntry const *criteria, AchievementEntry const *achievement)
 
void BuildAllDataPacket (WorldPacket *data) const
 
void UpdateTimedAchievements (uint32 timeDiff)
 
void ProcessOfflineUpdate (AchievementOfflinePlayerUpdate const &update)
 
void ProcessOfflineUpdatesQueue ()
 

Private Attributes

Player_player
 
CriteriaProgressMap _criteriaProgress
 
CompletedAchievementMap _completedAchievements
 
TimedAchievementMap _timedAchievements
 
uint32 _offlineUpdatesDelayTimer
 
std::vector< AchievementOfflinePlayerUpdate_offlineUpdatesQueue
 

Detailed Description

Member Typedef Documentation

◆ TimedAchievementMap

Member Enumeration Documentation

◆ ProgressType

Enumerator
PROGRESS_SET 
PROGRESS_ACCUMULATE 
PROGRESS_HIGHEST 
PROGRESS_RESET 
@ PROGRESS_SET
Definition AchievementMgr.h:320
@ PROGRESS_HIGHEST
Definition AchievementMgr.h:320
@ PROGRESS_ACCUMULATE
Definition AchievementMgr.h:320
@ PROGRESS_RESET
Definition AchievementMgr.h:320

Constructor & Destructor Documentation

◆ AchievementMgr()

AchievementMgr::AchievementMgr ( Player player)
486{
487 _player = player;
489}
Player * _player
Definition AchievementMgr.h:336
uint32 _offlineUpdatesDelayTimer
Definition AchievementMgr.h:345

References _offlineUpdatesDelayTimer, and _player.

◆ ~AchievementMgr()

AchievementMgr::~AchievementMgr ( )
492{
493}

Member Function Documentation

◆ BuildAllDataPacket()

void AchievementMgr::BuildAllDataPacket ( WorldPacket data) const
private

used by SMSG_RESPOND_INSPECT_ACHIEVEMENT and SMSG_ALL_ACHIEVEMENT_DATA

Todo:
: This should be 1 if it is a failed timed criteria
2414{
2415 for (CompletedAchievementMap::const_iterator iter = _completedAchievements.begin(); iter != _completedAchievements.end(); ++iter)
2416 {
2417 // Skip hidden achievements
2418 AchievementEntry const* achievement = sAchievementStore.LookupEntry(iter->first);
2419 if (!achievement || achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
2420 continue;
2421
2422 *data << uint32(iter->first);
2423 data->AppendPackedTime(iter->second.date);
2424 }
2425
2426 *data << int32(-1);
2427 time_t now = GameTime::GetGameTime().count();
2428
2429 for (CriteriaProgressMap::const_iterator iter = _criteriaProgress.begin(); iter != _criteriaProgress.end(); ++iter)
2430 {
2431 *data << uint32(iter->first);
2432 data->appendPackGUID(iter->second.counter);
2433 *data << GetPlayer()->GetPackGUID();
2434 *data << uint32(0);
2435 data->AppendPackedTime(iter->second.date);
2436 *data << uint32(now - iter->second.date);
2437
2438 if (sAchievementMgr->IsAverageCriteria(sAchievementCriteriaStore.LookupEntry(iter->first)))
2439 *data << uint32(now - GetPlayer()->GetCreationTime().count()); // for average achievements
2440 else
2441 *data << uint32(now - iter->second.date);
2442 }
2443
2444 *data << int32(-1);
2445}
#define sAchievementMgr
Definition AchievementMgr.h:451
@ ACHIEVEMENT_FLAG_HIDDEN
Definition DBCEnums.h:72
DBCStorage< AchievementCriteriaEntry > sAchievementCriteriaStore(AchievementCriteriafmt)
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
Player * GetPlayer() const
Definition AchievementMgr.h:309
CompletedAchievementMap _completedAchievements
Definition AchievementMgr.h:338
CriteriaProgressMap _criteriaProgress
Definition AchievementMgr.h:337
void appendPackGUID(uint64 guid)
Definition ByteBuffer.h:503
void AppendPackedTime(time_t time)
Definition ByteBuffer.cpp:137
PackedGuid const & GetPackGUID() const
Definition Object.h:116
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition DBCStructure.h:40
uint32 flags
Definition DBCStructure.h:52

References _completedAchievements, _criteriaProgress, ACHIEVEMENT_FLAG_HIDDEN, ByteBuffer::AppendPackedTime(), ByteBuffer::appendPackGUID(), AchievementEntry::flags, GameTime::GetGameTime(), Object::GetPackGUID(), GetPlayer(), sAchievementCriteriaStore, sAchievementMgr, and sAchievementStore.

Referenced by SendAllAchievementData(), and SendRespondInspectAchievements().

◆ CanUpdateCriteria()

bool AchievementMgr::CanUpdateCriteria ( AchievementCriteriaEntry const *  criteria,
AchievementEntry const *  achievement 
)
private
2453{
2454 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_ACHIEVEMENT_CRITERIA, criteria->ID, nullptr))
2455 return false;
2456
2457 if (achievement->mapID != -1 && GetPlayer()->GetMapId() != uint32(achievement->mapID))
2458 return false;
2459
2460 if ((achievement->requiredFaction == ACHIEVEMENT_FACTION_HORDE && GetPlayer()->GetTeamId(true) != TEAM_HORDE) ||
2461 (achievement->requiredFaction == ACHIEVEMENT_FACTION_ALLIANCE && GetPlayer()->GetTeamId(true) != TEAM_ALLIANCE))
2462 return false;
2463
2464 for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i)
2465 {
2466 if (!criteria->additionalRequirements[i].additionalRequirement_type)
2467 continue;
2468
2469 switch (criteria->additionalRequirements[i].additionalRequirement_type)
2470 {
2472 if (GetPlayer()->GetMapId() != criteria->additionalRequirements[i].additionalRequirement_value)
2473 return false;
2474 break;
2476 if (GetPlayer()->GetGroup())
2477 return false;
2478 break;
2479 default:
2480 break;
2481 }
2482 }
2483
2484 // don't update already completed criteria
2485 if (IsCompletedCriteria(criteria, achievement))
2486 return false;
2487
2488 return true;
2489}
@ ACHIEVEMENT_FACTION_HORDE
Definition DBCEnums.h:64
@ ACHIEVEMENT_FACTION_ALLIANCE
Definition DBCEnums.h:65
@ ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP
Definition DBCEnums.h:93
@ ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP
Definition DBCEnums.h:90
#define MAX_CRITERIA_REQUIREMENTS
Definition DBCEnums.h:83
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_ACHIEVEMENT_CRITERIA
Definition DisableMgr.h:32
TeamId GetTeamId(PvPTeamId teamId)
Definition SharedDefines.h:3718
@ TEAM_ALLIANCE
Definition SharedDefines.h:748
@ TEAM_HORDE
Definition SharedDefines.h:749
bool IsCompletedCriteria(AchievementCriteriaEntry const *achievementCriteria, AchievementEntry const *achievement)
Definition AchievementMgr.cpp:1825

References ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP, ACHIEVEMENT_FACTION_ALLIANCE, ACHIEVEMENT_FACTION_HORDE, AchievementCriteriaEntry::additionalRequirement_type, AchievementCriteriaEntry::additionalRequirement_value, AchievementCriteriaEntry::additionalRequirements, DISABLE_TYPE_ACHIEVEMENT_CRITERIA, GetPlayer(), GetTeamId(), AchievementCriteriaEntry::ID, IsCompletedCriteria(), AchievementEntry::mapID, MAX_CRITERIA_REQUIREMENTS, AchievementEntry::requiredFaction, sDisableMgr, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by UpdateAchievementCriteria().

◆ CheckAllAchievementCriteria()

void AchievementMgr::CheckAllAchievementCriteria ( )

called at player login. The player might have fulfilled some achievements when the achievement system wasn't working yet.

801{
802 // suppress sending packets
803 for (uint32 i = 0; i < ACHIEVEMENT_CRITERIA_TYPE_TOTAL; ++i)
805}
AchievementCriteriaTypes
Definition DBCEnums.h:121
@ ACHIEVEMENT_CRITERIA_TYPE_TOTAL
Definition DBCEnums.h:224
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition AchievementMgr.cpp:822

References ACHIEVEMENT_CRITERIA_TYPE_TOTAL, and UpdateAchievementCriteria().

Referenced by Player::CheckAllAchievementCriteria(), and Reset().

◆ CompletedAchievement()

void AchievementMgr::CompletedAchievement ( AchievementEntry const *  entry)

Currently there's only one achievement that deals with gender-specific titles. Since no common attributes were found, (not even in titleRewardFlags field) we explicitly check by ID. Maybe in the future we could move the achievement_reward condition fields to the condition system.

2282{
2283 // disable for gamemasters with GM-mode enabled
2284 if (_player->IsGameMaster())
2285 {
2286 LOG_INFO("achievement", "Not available in GM mode.");
2287 ChatHandler(_player->GetSession()).PSendSysMessage("Not available in GM mode");
2288 return;
2289 }
2291 return;
2292
2293 if (!sScriptMgr->OnPlayerBeforeAchievementComplete(GetPlayer(), achievement))
2294 {
2295 return;
2296 }
2297
2298 if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER || HasAchieved(achievement->ID))
2299 return;
2300
2301 LOG_DEBUG("achievement", "AchievementMgr::CompletedAchievement({})", achievement->ID);
2302
2303 SendAchievementEarned(achievement);
2304 CompletedAchievementData& ca = _completedAchievements[achievement->ID];
2305 ca.date = GameTime::GetGameTime().count();
2306 ca.changed = true;
2307
2308 sScriptMgr->OnPlayerAchievementComplete(GetPlayer(), achievement);
2309
2310 // pussywizard: set all progress counters to 0, so progress will be deleted from db during save
2311 {
2312 bool allRefsCompleted = true;
2313 uint32 achiCheckId = achievement->refAchievement ? achievement->refAchievement : achievement->ID;
2314
2315 if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achiCheckId))
2316 for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
2317 if (!IsCompletedAchievement(*itr))
2318 {
2319 allRefsCompleted = false;
2320 break;
2321 }
2322
2323 if (allRefsCompleted)
2324 if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(achiCheckId))
2325 for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
2326 if (CriteriaProgress* progress = GetCriteriaProgress(*itr))
2327 {
2328 progress->changed = true;
2329 progress->counter = 0;
2330 }
2331 }
2332
2334 sAchievementMgr->SetRealmCompleted(achievement);
2335
2338
2339 // reward items and titles if any
2340 AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement);
2341
2342 // no rewards
2343 if (!reward)
2344 return;
2345
2346 // titles
2351 if (uint32 titleId = reward->titleId[achievement->ID == 1793 ? GetPlayer()->getGender() : uint8(GetPlayer()->GetTeamId())])
2352 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId))
2353 GetPlayer()->SetTitle(titleEntry);
2354
2355 // mail
2356 if (reward->sender)
2357 {
2358 MailDraft draft(reward->mailTemplate);
2359
2360 if (!reward->mailTemplate)
2361 {
2362 std::string subject = reward->subject;
2363 std::string text = reward->text;
2364
2366 if (localeConstant != LOCALE_enUS)
2367 {
2368 if (AchievementRewardLocale const* loc = sAchievementMgr->GetAchievementRewardLocale(achievement))
2369 {
2370 ObjectMgr::GetLocaleString(loc->Subject, localeConstant, subject);
2371 ObjectMgr::GetLocaleString(loc->Text, localeConstant, text);
2372 }
2373 }
2374
2375 draft = MailDraft(subject, text);
2376 }
2377
2378 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2379
2380 Item* item = reward->itemId ? Item::CreateItem(reward->itemId, 1, GetPlayer()) : nullptr;
2381 if (item)
2382 {
2383 // save new item before send
2384 item->SaveToDB(trans); // save for prevent lost at next mail load, if send fail then item will deleted
2385
2386 // item
2387 draft.AddItem(item);
2388 }
2389
2390 draft.SendMailTo(trans, GetPlayer(), MailSender(MAIL_CREATURE, reward->sender));
2391 CharacterDatabase.CommitTransaction(trans);
2392 }
2393}
std::list< AchievementCriteriaEntry const * > AchievementCriteriaEntryList
Definition AchievementMgr.h:29
std::list< AchievementEntry const * > AchievementEntryList
Definition AchievementMgr.h:30
LocaleConstant
Definition Common.h:117
@ LOCALE_enUS
Definition Common.h:118
@ ACHIEVEMENT_FLAG_COUNTER
Definition DBCEnums.h:71
@ ACHIEVEMENT_FLAG_REALM_FIRST_REACH
Definition DBCEnums.h:79
@ ACHIEVEMENT_FLAG_REALM_FIRST_KILL
Definition DBCEnums.h:80
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT
Definition DBCEnums.h:126
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS
Definition DBCEnums.h:221
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint8_t uint8
Definition Define.h:109
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_DEBUG(filterType__,...)
Definition Log.h:157
@ MAIL_CREATURE
Definition Mail.h:39
#define sScriptMgr
Definition ScriptMgr.h:737
CriteriaProgress * GetCriteriaProgress(AchievementCriteriaEntry const *entry)
Definition AchievementMgr.cpp:2100
bool HasAchieved(uint32 achievementId) const
Definition AchievementMgr.cpp:2447
bool IsCompletedAchievement(AchievementEntry const *entry)
Definition AchievementMgr.cpp:2038
void SendAchievementEarned(AchievementEntry const *achievement) const
Definition AchievementMgr.cpp:707
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:336
Definition Mail.h:119
Definition Mail.h:83
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition ObjectMgr.h:1486
WorldSession * GetSession() const
Definition Player.h:2020
bool IsGameMaster() const
Definition Player.h:1174
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:589
bool HasPermission(uint32 permissionId)
Definition WorldSession.cpp:1551
@ RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS
Definition RBAC.h:60
@ RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS
Definition RBAC.h:59
Definition AchievementMgr.h:272
Definition AchievementMgr.h:260
std::string subject
Definition AchievementMgr.h:264
std::string text
Definition AchievementMgr.h:265
uint32 titleId[2]
Definition AchievementMgr.h:261
uint32 sender
Definition AchievementMgr.h:263
uint32 mailTemplate
Definition AchievementMgr.h:266
uint32 itemId
Definition AchievementMgr.h:262
Definition DBCStructure.h:632
Definition AchievementMgr.h:280
time_t date
Definition AchievementMgr.h:281
bool changed
Definition AchievementMgr.h:282
Definition AchievementMgr.h:50

References _completedAchievements, _player, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, ACHIEVEMENT_FLAG_COUNTER, ACHIEVEMENT_FLAG_REALM_FIRST_KILL, ACHIEVEMENT_FLAG_REALM_FIRST_REACH, MailDraft::AddItem(), CompletedAchievementData::changed, CharacterDatabase, Item::CreateItem(), CompletedAchievementData::date, AchievementEntry::flags, GetCriteriaProgress(), GameTime::GetGameTime(), ObjectMgr::GetLocaleString(), GetPlayer(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), WorldSession::HasPermission(), AchievementEntry::ID, IsCompletedAchievement(), Player::IsGameMaster(), AchievementReward::itemId, LOCALE_enUS, LOG_DEBUG, LOG_INFO, MAIL_CREATURE, AchievementReward::mailTemplate, AchievementEntry::points, ChatHandler::PSendSysMessage(), rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS, rbac::RBAC_PERM_CANNOT_EARN_REALM_FIRST_ACHIEVEMENTS, AchievementEntry::refAchievement, sAchievementMgr, Item::SaveToDB(), sCharTitlesStore, SendAchievementEarned(), AchievementReward::sender, MailDraft::SendMailTo(), Player::SetTitle(), sScriptMgr, AchievementReward::subject, AchievementReward::text, AchievementReward::titleId, and UpdateAchievementCriteria().

Referenced by Player::CompletedAchievement(), CompletedCriteriaFor(), ProcessOfflineUpdate(), and UpdateAchievementCriteria().

◆ CompletedCriteriaFor()

void AchievementMgr::CompletedCriteriaFor ( AchievementEntry const *  achievement)
private
2025{
2026 // counter can never complete
2027 if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
2028 return;
2029
2030 // already completed and stored
2031 if (HasAchieved(achievement->ID))
2032 return;
2033
2034 if (IsCompletedAchievement(achievement))
2035 CompletedAchievement(achievement);
2036}
void CompletedAchievement(AchievementEntry const *entry)
Definition AchievementMgr.cpp:2281

References ACHIEVEMENT_FLAG_COUNTER, CompletedAchievement(), AchievementEntry::flags, HasAchieved(), AchievementEntry::ID, and IsCompletedAchievement().

Referenced by UpdateAchievementCriteria().

◆ DeleteFromDB()

void AchievementMgr::DeleteFromDB ( ObjectGuid::LowType  lowguid)
static
549{
550 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
551
553 stmt->SetData(0, lowguid);
554 trans->Append(stmt);
555
556 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
557 stmt->SetData(0, lowguid);
558 trans->Append(stmt);
559
561 stmt->SetData(0, lowguid);
562 trans->Append(stmt);
563
564 CharacterDatabase.CommitTransaction(trans);
565}
@ CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES
Definition CharacterDatabase.h:374
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition CharacterDatabase.h:368
@ CHAR_DEL_CHAR_ACHIEVEMENT
Definition CharacterDatabase.h:367
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157

References CHAR_DEL_CHAR_ACHIEVEMENT, CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CharacterDatabase, and PreparedStatementBase::SetData().

Referenced by reset_commandscript::HandleResetAchievementsCommand(), and Reset().

◆ GetCompletedAchievements()

CompletedAchievementMap const & AchievementMgr::GetCompletedAchievements ( )
2492{
2494}

References _completedAchievements.

◆ GetCriteriaProgress()

CriteriaProgress * AchievementMgr::GetCriteriaProgress ( AchievementCriteriaEntry const *  entry)
2101{
2102 CriteriaProgressMap::iterator iter = _criteriaProgress.find(entry->ID);
2103
2104 if (iter == _criteriaProgress.end())
2105 return nullptr;
2106
2107 return &(iter->second);
2108}

References _criteriaProgress, and AchievementCriteriaEntry::ID.

Referenced by CompletedAchievement(), IsCompletedAchievement(), IsCompletedCriteria(), SetCriteriaProgress(), and UpdateAchievementCriteria().

◆ GetPlayer()

◆ HasAchieved()

bool AchievementMgr::HasAchieved ( uint32  achievementId) const

◆ IsCompletedAchievement()

bool AchievementMgr::IsCompletedAchievement ( AchievementEntry const *  entry)
private
2039{
2040 // counter can never complete
2041 if (entry->flags & ACHIEVEMENT_FLAG_COUNTER)
2042 return false;
2043
2044 // for achievement with referenced achievement criterias get from referenced and counter from self
2045 uint32 achievmentForTestId = entry->refAchievement ? entry->refAchievement : entry->ID;
2046 uint32 achievmentForTestCount = entry->count;
2047
2048 AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(achievmentForTestId);
2049 if (!cList)
2050 return false;
2051 uint32 count = 0;
2052
2053 // For SUMM achievements, we have to count the progress of each criteria of the achievement.
2054 // Oddly, the target count is NOT countained in the achievement, but in each individual criteria
2055 if (entry->flags & ACHIEVEMENT_FLAG_SUMM)
2056 {
2057 for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
2058 {
2059 AchievementCriteriaEntry const* criteria = *itr;
2060
2061 CriteriaProgress const* progress = GetCriteriaProgress(criteria);
2062 if (!progress)
2063 continue;
2064
2065 count += progress->counter;
2066
2067 // for counters, field4 contains the main count requirement
2068 if (count >= criteria->raw.count)
2069 return true;
2070 }
2071 return false;
2072 }
2073
2074 // Default case - need complete all or
2075 bool completed_all = true;
2076 for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
2077 {
2078 AchievementCriteriaEntry const* criteria = *itr;
2079
2080 bool completed = IsCompletedCriteria(criteria, entry);
2081
2082 // found an uncompleted criteria, but DONT return false yet - there might be a completed criteria with ACHIEVEMENT_CRITERIA_COMPLETE_FLAG_ALL
2083 if (completed)
2084 ++count;
2085 else
2086 completed_all = false;
2087
2088 // completed as have req. count of completed criterias
2089 if (achievmentForTestCount > 0 && achievmentForTestCount <= count)
2090 return true;
2091 }
2092
2093 // all criterias completed requirement
2094 if (completed_all && achievmentForTestCount == 0)
2095 return true;
2096
2097 return false;
2098}
@ ACHIEVEMENT_FLAG_SUMM
Definition DBCEnums.h:74
Definition DBCStructure.h:70
struct AchievementCriteriaEntry::@312::@376 raw
uint32 count
Definition DBCStructure.h:223
uint32 counter
Definition AchievementMgr.h:51

References ACHIEVEMENT_FLAG_COUNTER, ACHIEVEMENT_FLAG_SUMM, AchievementEntry::count, AchievementCriteriaEntry::count, CriteriaProgress::counter, AchievementEntry::flags, GetCriteriaProgress(), AchievementEntry::ID, IsCompletedCriteria(), AchievementCriteriaEntry::raw, AchievementEntry::refAchievement, and sAchievementMgr.

Referenced by CompletedAchievement(), CompletedCriteriaFor(), IsCompletedCriteria(), and UpdateAchievementCriteria().

◆ IsCompletedCriteria()

bool AchievementMgr::IsCompletedCriteria ( AchievementCriteriaEntry const *  achievementCriteria,
AchievementEntry const *  achievement 
)
private
1826{
1827 // counter can never complete
1828 if (achievement->flags & ACHIEVEMENT_FLAG_COUNTER)
1829 return false;
1830
1832 {
1833 // someone on this realm has already completed that achievement
1834 if (sAchievementMgr->IsRealmCompleted(achievement))
1835 return false;
1836
1837 // A character may only have 1 race-specific 'Realm First!' achievement
1838 // prevent clever use of the race/faction change service to obtain multiple 'Realm First!' achievements
1839 constexpr std::array<uint32, 9> raceSpecificRealmFirstAchievements { 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413 };
1840 bool isRaceSpecific = std::ranges::find(raceSpecificRealmFirstAchievements, achievement->ID) != std::ranges::end(raceSpecificRealmFirstAchievements);
1841 if (isRaceSpecific)
1842 for (uint32 raceAchievementId : raceSpecificRealmFirstAchievements)
1843 if (raceAchievementId != achievement->ID && HasAchieved(raceAchievementId))
1844 return false;
1845 }
1846
1847 // pussywizard: progress will be deleted after getting the achievement (optimization)
1848 // finished achievement should indicate criteria completed, since not finding progress would start some timed achievements and probably other things
1849 if (HasAchieved(achievement->ID))
1850 {
1851 bool completed = true;
1852
1853 // completed only after all referenced achievements are also completed
1854 if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID))
1855 for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
1856 if (!IsCompletedAchievement(*itr))
1857 {
1858 completed = false;
1859 break;
1860 }
1861
1862 if (completed)
1863 return true;
1864 }
1865
1866 CriteriaProgress const* progress = GetCriteriaProgress(achievementCriteria);
1867 if (!progress)
1868 return false;
1869
1870 if (!sScriptMgr->IsCompletedCriteria(this, achievementCriteria, achievement, progress))
1871 return false;
1872
1873 switch (achievementCriteria->requiredType)
1874 {
1876 return progress->counter >= achievementCriteria->win_bg.winCount;
1878 return progress->counter >= achievementCriteria->kill_creature.creatureCount;
1880 return progress->counter >= achievementCriteria->reach_level.level;
1882 return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
1884 return progress->counter >= 1;
1886 return progress->counter >= achievementCriteria->complete_quest_count.totalQuestCount;
1888 return progress->counter >= achievementCriteria->complete_daily_quest_daily.numberOfDays;
1890 return progress->counter >= achievementCriteria->complete_quests_in_zone.questCount;
1893 return progress->counter >= achievementCriteria->healing_done.count;
1895 return progress->counter >= achievementCriteria->complete_daily_quest.questCount;
1897 return progress->counter >= achievementCriteria->fall_without_dying.fallHeight;
1899 return progress->counter >= 1;
1902 return progress->counter >= achievementCriteria->be_spell_target.spellCount;
1905 return progress->counter >= achievementCriteria->cast_spell.castCount;
1907 return progress->counter >= achievementCriteria->bg_objective.completeCount;
1909 return progress->counter >= achievementCriteria->honorable_kill_at_area.killCount;
1911 return progress->counter >= 1;
1914 return progress->counter >= achievementCriteria->honorable_kill.killCount;
1916 return progress->counter >= achievementCriteria->own_item.itemCount;
1918 return progress->counter >= achievementCriteria->win_rated_arena.count;
1920 return progress->counter >= achievementCriteria->highest_personal_rating.PersonalRating;
1922 return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
1924 return progress->counter >= achievementCriteria->use_item.itemCount;
1926 return progress->counter >= achievementCriteria->loot_item.itemCount;
1928 return progress->counter >= 1;
1930 return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
1932 return progress->counter >= achievementCriteria->gain_reputation.reputationAmount;
1934 return progress->counter >= achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
1936 return progress->counter >= achievementCriteria->visit_barber.numberOfVisits;
1938 return progress->counter >= achievementCriteria->equip_epic_item.count;
1941 return progress->counter >= achievementCriteria->roll_greed_on_loot.count;
1943 return progress->counter >= achievementCriteria->hk_class.count;
1945 return progress->counter >= achievementCriteria->hk_race.count;
1947 return progress->counter >= achievementCriteria->do_emote.count;
1949 return progress->counter >= achievementCriteria->equip_item.count;
1951 return progress->counter >= achievementCriteria->quest_reward_money.goldInCopper;
1953 return progress->counter >= achievementCriteria->loot_money.goldInCopper;
1955 return progress->counter >= achievementCriteria->use_gameobject.useCount;
1957 return progress->counter >= achievementCriteria->special_pvp_kill.killCount;
1959 return progress->counter >= achievementCriteria->fish_in_gameobject.lootCount;
1961 return progress->counter >= achievementCriteria->learn_skillline_spell.spellCount;
1963 return progress->counter >= achievementCriteria->win_duel.duelCount;
1965 return progress->counter >= achievementCriteria->loot_type.lootTypeCount;
1967 return progress->counter >= achievementCriteria->learn_skill_line.spellCount;
1969 return progress->counter >= 9000;
1971 return progress->counter >= achievementCriteria->use_lfg.dungeonsComplete;
1973 return progress->counter >= achievementCriteria->get_killing_blow.killCount;
1975 return true;
1977 return achievementCriteria->win_arena.count && progress->counter >= achievementCriteria->win_arena.count;
1979 return true;
1980 // handle all statistic-only criteria here
2018 default:
2019 break;
2020 }
2021 return false;
2022}
@ ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION
Definition DBCEnums.h:190
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE
Definition DBCEnums.h:216
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2
Definition DBCEnums.h:181
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM
Definition DBCEnums.h:155
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED
Definition DBCEnums.h:194
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL
Definition DBCEnums.h:178
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET
Definition DBCEnums.h:142
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA
Definition DBCEnums.h:147
@ ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT
Definition DBCEnums.h:183
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition DBCEnums.h:139
@ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL
Definition DBCEnums.h:143
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM
Definition DBCEnums.h:156
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR
Definition DBCEnums.h:206
@ ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP
Definition DBCEnums.h:162
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS
Definition DBCEnums.h:189
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND
Definition DBCEnums.h:132
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH
Definition DBCEnums.h:202
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition DBCEnums.h:158
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID
Definition DBCEnums.h:136
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT
Definition DBCEnums.h:165
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER
Definition DBCEnums.h:177
@ ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT
Definition DBCEnums.h:180
@ ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE
Definition DBCEnums.h:168
@ ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS
Definition DBCEnums.h:192
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition DBCEnums.h:150
@ ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION
Definition DBCEnums.h:161
@ ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS
Definition DBCEnums.h:223
@ ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED
Definition DBCEnums.h:214
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT
Definition DBCEnums.h:159
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED
Definition DBCEnums.h:201
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition DBCEnums.h:124
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE
Definition DBCEnums.h:188
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition DBCEnums.h:140
@ ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION
Definition DBCEnums.h:195
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER
Definition DBCEnums.h:205
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM
Definition DBCEnums.h:198
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION
Definition DBCEnums.h:160
@ ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2
Definition DBCEnums.h:217
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition DBCEnums.h:218
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_DISENCHANT
Definition DBCEnums.h:222
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition DBCEnums.h:141
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
Definition DBCEnums.h:151
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS
Definition DBCEnums.h:197
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition DBCEnums.h:157
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS
Definition DBCEnums.h:172
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition DBCEnums.h:154
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition DBCEnums.h:163
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID
Definition DBCEnums.h:191
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition DBCEnums.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD
Definition DBCEnums.h:193
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition DBCEnums.h:135
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition DBCEnums.h:220
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING
Definition DBCEnums.h:152
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_BG
Definition DBCEnums.h:123
@ ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION
Definition DBCEnums.h:196
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
Definition DBCEnums.h:144
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
@ ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY
Definition DBCEnums.h:179
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA
Definition DBCEnums.h:146
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition DBCEnums.h:174
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT
Definition DBCEnums.h:164
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition DBCEnums.h:199
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING
Definition DBCEnums.h:153
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition DBCEnums.h:166
@ ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED
Definition DBCEnums.h:200
@ ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN
Definition DBCEnums.h:184
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition DBCEnums.h:187

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID, ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, 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_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA, ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED, ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_ROLL_DISENCHANT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, ACHIEVEMENT_FLAG_COUNTER, ACHIEVEMENT_FLAG_REALM_FIRST_KILL, ACHIEVEMENT_FLAG_REALM_FIRST_REACH, AchievementCriteriaEntry::be_spell_target, AchievementCriteriaEntry::bg_objective, AchievementCriteriaEntry::buy_bank_slot, AchievementCriteriaEntry::cast_spell, AchievementCriteriaEntry::castCount, AchievementCriteriaEntry::complete_daily_quest, AchievementCriteriaEntry::complete_daily_quest_daily, AchievementCriteriaEntry::complete_quest_count, AchievementCriteriaEntry::complete_quests_in_zone, AchievementCriteriaEntry::completeCount, AchievementCriteriaEntry::count, CriteriaProgress::counter, AchievementCriteriaEntry::creatureCount, AchievementCriteriaEntry::do_emote, AchievementCriteriaEntry::duelCount, AchievementCriteriaEntry::dungeonsComplete, AchievementCriteriaEntry::equip_epic_item, AchievementCriteriaEntry::equip_item, AchievementCriteriaEntry::fall_without_dying, AchievementCriteriaEntry::fallHeight, AchievementCriteriaEntry::fish_in_gameobject, AchievementEntry::flags, AchievementCriteriaEntry::gain_exalted_reputation, AchievementCriteriaEntry::gain_reputation, AchievementCriteriaEntry::get_killing_blow, GetCriteriaProgress(), AchievementCriteriaEntry::goldInCopper, HasAchieved(), AchievementCriteriaEntry::healing_done, AchievementCriteriaEntry::highest_personal_rating, AchievementCriteriaEntry::hk_class, AchievementCriteriaEntry::hk_race, AchievementCriteriaEntry::honorable_kill, AchievementCriteriaEntry::honorable_kill_at_area, AchievementEntry::ID, IsCompletedAchievement(), AchievementCriteriaEntry::itemCount, AchievementCriteriaEntry::kill_creature, AchievementCriteriaEntry::killCount, AchievementCriteriaEntry::learn_skill_level, AchievementCriteriaEntry::learn_skill_line, AchievementCriteriaEntry::learn_skillline_spell, AchievementCriteriaEntry::level, AchievementCriteriaEntry::loot_item, AchievementCriteriaEntry::loot_money, AchievementCriteriaEntry::loot_type, AchievementCriteriaEntry::lootCount, AchievementCriteriaEntry::lootTypeCount, AchievementCriteriaEntry::numberOfDays, AchievementCriteriaEntry::numberOfExaltedFactions, AchievementCriteriaEntry::numberOfSlots, AchievementCriteriaEntry::numberOfVisits, AchievementCriteriaEntry::own_item, AchievementCriteriaEntry::PersonalRating, AchievementCriteriaEntry::quest_reward_money, AchievementCriteriaEntry::questCount, AchievementCriteriaEntry::reach_level, AchievementCriteriaEntry::reach_skill_level, AchievementCriteriaEntry::reputationAmount, AchievementCriteriaEntry::requiredType, AchievementCriteriaEntry::roll_greed_on_loot, sAchievementMgr, AchievementCriteriaEntry::skillLevel, AchievementCriteriaEntry::special_pvp_kill, AchievementCriteriaEntry::spellCount, sScriptMgr, AchievementCriteriaEntry::totalQuestCount, AchievementCriteriaEntry::use_gameobject, AchievementCriteriaEntry::use_item, AchievementCriteriaEntry::use_lfg, AchievementCriteriaEntry::useCount, AchievementCriteriaEntry::visit_barber, AchievementCriteriaEntry::win_arena, AchievementCriteriaEntry::win_bg, AchievementCriteriaEntry::win_duel, AchievementCriteriaEntry::win_rated_arena, and AchievementCriteriaEntry::winCount.

Referenced by CanUpdateCriteria(), IsCompletedAchievement(), ResetAchievementCriteria(), SetCriteriaProgress(), StartTimedAchievement(), and UpdateAchievementCriteria().

◆ LoadFromDB()

void AchievementMgr::LoadFromDB ( PreparedQueryResult  achievementResult,
PreparedQueryResult  criteriaResult,
PreparedQueryResult  offlineUpdatesResult 
)
624{
625 if (achievementResult)
626 {
627 do
628 {
629 Field* fields = achievementResult->Fetch();
630 uint32 achievementid = fields[0].Get<uint16>();
631
632 // must not happen: cleanup at server startup in sAchievementMgr->LoadCompletedAchievements()
633 AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementid);
634 if (!achievement)
635 continue;
636
638 ca.date = time_t(fields[1].Get<uint32>());
639 ca.changed = false;
640
641 // title achievement rewards are retroactive
642 if (AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement))
643 if (uint32 titleId = reward->titleId[Player::TeamIdForRace(GetPlayer()->getRace())])
644 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(titleId))
645 if (!GetPlayer()->HasTitle(titleEntry))
646 GetPlayer()->SetTitle(titleEntry);
647 } while (achievementResult->NextRow());
648 }
649
650 if (criteriaResult)
651 {
652 do
653 {
654 Field* fields = criteriaResult->Fetch();
655 uint32 id = fields[0].Get<uint16>();
656 uint32 counter = fields[1].Get<uint32>();
657 time_t date = time_t(fields[2].Get<uint32>());
658
659 AchievementCriteriaEntry const* criteria = sAchievementCriteriaStore.LookupEntry(id);
660 if (!criteria)
661 {
662 // we will remove not existed criteria for all characters
663 LOG_ERROR("achievement", "Non-existing achievement criteria {} data removed from table `character_achievement_progress`.", id);
664
666
667 stmt->SetData(0, uint16(id));
668
669 CharacterDatabase.Execute(stmt);
670
671 continue;
672 }
673
674 if (criteria->timeLimit && time_t(date + criteria->timeLimit) < GameTime::GetGameTime().count())
675 continue;
676
677 CriteriaProgress& progress = _criteriaProgress[id];
678 progress.counter = counter;
679 progress.date = date;
680 progress.changed = false;
681 } while (criteriaResult->NextRow());
682 }
683
684 if (offlineUpdatesResult)
685 {
686 uint32 count = 0;
687 do
688 {
689 Field* fields = offlineUpdatesResult->Fetch();
690
692 update.updateType = static_cast<AchievementOfflinePlayerUpdateType>(fields[0].Get<uint8>());
693 update.arg1 = fields[1].Get<uint32>();
694 update.arg2 = fields[2].Get<uint32>();
695 update.arg3 = fields[3].Get<uint32>();
696
697 _offlineUpdatesQueue.push_back(update);
698
699 ++count;
700 } while (offlineUpdatesResult->NextRow());
701
702 if (count > 0)
704 }
705}
AchievementOfflinePlayerUpdateType
Definition AchievementMgr.h:36
@ CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA
Definition CharacterDatabase.h:300
constexpr auto SECOND
Definition Common.h:46
constexpr auto IN_MILLISECONDS
Definition Common.h:53
std::uint16_t uint16
Definition Define.h:108
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
std::vector< AchievementOfflinePlayerUpdate > _offlineUpdatesQueue
Definition AchievementMgr.h:346
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5829
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition Player.cpp:13389
uint32 timeLimit
Definition DBCStructure.h:514
Definition AchievementMgr.h:42
uint32 arg2
Definition AchievementMgr.h:45
AchievementOfflinePlayerUpdateType updateType
Definition AchievementMgr.h:43
uint32 arg1
Definition AchievementMgr.h:44
uint32 arg3
Definition AchievementMgr.h:46
time_t date
Definition AchievementMgr.h:52
bool changed
Definition AchievementMgr.h:53

References _completedAchievements, _criteriaProgress, _offlineUpdatesDelayTimer, _offlineUpdatesQueue, AchievementOfflinePlayerUpdate::arg1, AchievementOfflinePlayerUpdate::arg2, AchievementOfflinePlayerUpdate::arg3, CriteriaProgress::changed, CompletedAchievementData::changed, CHAR_DEL_INVALID_ACHIEV_PROGRESS_CRITERIA, CharacterDatabase, CriteriaProgress::counter, CriteriaProgress::date, CompletedAchievementData::date, Field::Get(), GameTime::GetGameTime(), GetPlayer(), IN_MILLISECONDS, LOG_ERROR, sAchievementCriteriaStore, sAchievementMgr, sAchievementStore, sCharTitlesStore, SECOND, PreparedStatementBase::SetData(), Player::SetTitle(), Player::TeamIdForRace(), AchievementCriteriaEntry::timeLimit, and AchievementOfflinePlayerUpdate::updateType.

Referenced by Player::LoadFromDB().

◆ ProcessOfflineUpdate()

void AchievementMgr::ProcessOfflineUpdate ( AchievementOfflinePlayerUpdate const &  update)
private
2512{
2513 switch (update.updateType)
2514 {
2516 {
2517 AchievementEntry const* achievement = sAchievementStore.LookupEntry(update.arg1);
2518
2519 ASSERT(achievement, "Not found achievement to complete for offline achievements update. Wrong arg1 ({}) value?", update.arg1);
2520
2521 CompletedAchievement(achievement);
2522 break;
2523 }
2525 {
2526 AchievementCriteriaTypes criteriaType = static_cast<AchievementCriteriaTypes>(update.arg1);
2527 UpdateAchievementCriteria(criteriaType, update.arg2, update.arg3);
2528 break;
2529 }
2530 default:
2531 ASSERT(false, "Unknown offline achievement update type ({}) for player - {}", update.updateType, GetPlayer()->GetGUID().GetCounter());
2532 break;
2533 }
2534}
@ ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT
Definition AchievementMgr.h:37
@ ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA
Definition AchievementMgr.h:38
#define ASSERT
Definition Errors.h:68

References ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_OFFLINE_PLAYER_UPDATE_TYPE_UPDATE_CRITERIA, AchievementOfflinePlayerUpdate::arg1, AchievementOfflinePlayerUpdate::arg2, AchievementOfflinePlayerUpdate::arg3, ASSERT, CompletedAchievement(), GetPlayer(), sAchievementStore, UpdateAchievementCriteria(), and AchievementOfflinePlayerUpdate::updateType.

Referenced by ProcessOfflineUpdatesQueue().

◆ ProcessOfflineUpdatesQueue()

void AchievementMgr::ProcessOfflineUpdatesQueue ( )
private
2497{
2498 if (_offlineUpdatesQueue.empty())
2499 return;
2500
2501 for (auto const& update : _offlineUpdatesQueue)
2502 ProcessOfflineUpdate(update);
2503
2504 _offlineUpdatesQueue.clear();
2505
2507 stmt->SetData(0, GetPlayer()->GetGUID().GetCounter());
2508 CharacterDatabase.Execute(stmt);
2509}
void ProcessOfflineUpdate(AchievementOfflinePlayerUpdate const &update)
Definition AchievementMgr.cpp:2511

References _offlineUpdatesQueue, CHAR_DEL_CHAR_ACHIEVEMENT_OFFLINE_UPDATES, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), GetPlayer(), ProcessOfflineUpdate(), and PreparedStatementBase::SetData().

Referenced by Update().

◆ RemoveCriteriaProgress()

void AchievementMgr::RemoveCriteriaProgress ( AchievementCriteriaEntry const *  entry)
2187{
2188 CriteriaProgressMap::iterator criteriaProgress = _criteriaProgress.find(entry->ID);
2189 if (criteriaProgress == _criteriaProgress.end())
2190 return;
2191
2193 data << uint32(entry->ID);
2194 _player->SendDirectMessage(&data);
2195
2196 _criteriaProgress.erase(criteriaProgress);
2197}
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5692
Definition WorldPacket.h:26
@ SMSG_CRITERIA_DELETED
Definition Opcodes.h:1212

References _criteriaProgress, _player, AchievementCriteriaEntry::ID, Player::SendDirectMessage(), and SMSG_CRITERIA_DELETED.

Referenced by RemoveTimedAchievement(), ResetAchievementCriteria(), and UpdateTimedAchievements().

◆ RemoveTimedAchievement()

void AchievementMgr::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
2261{
2262 AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type);
2263 for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
2264 {
2265 if ((*i)->timerStartEvent != entry)
2266 continue;
2267
2268 TimedAchievementMap::iterator timedIter = _timedAchievements.find((*i)->ID);
2269 // We don't have timer for this achievement
2270 if (timedIter == _timedAchievements.end())
2271 continue;
2272
2273 // remove progress
2275
2276 // Remove the timer
2277 _timedAchievements.erase(timedIter);
2278 }
2279}
TimedAchievementMap _timedAchievements
Definition AchievementMgr.h:340
void RemoveCriteriaProgress(AchievementCriteriaEntry const *entry)
Definition AchievementMgr.cpp:2186

References _timedAchievements, RemoveCriteriaProgress(), and sAchievementMgr.

Referenced by Player::RemoveTimedAchievement().

◆ Reset()

void AchievementMgr::Reset ( )
496{
497 for (CompletedAchievementMap::const_iterator iter = _completedAchievements.begin(); iter != _completedAchievements.end(); ++iter)
498 {
500 data << uint32(iter->first);
502 }
503
504 for (CriteriaProgressMap::const_iterator iter = _criteriaProgress.begin(); iter != _criteriaProgress.end(); ++iter)
505 {
507 data << uint32(iter->first);
509 }
510
512 _criteriaProgress.clear();
514
515 // re-fill data
517}
void CheckAllAchievementCriteria()
Definition AchievementMgr.cpp:800
static void DeleteFromDB(ObjectGuid::LowType lowguid)
Definition AchievementMgr.cpp:548
LowType GetCounter() const
Definition ObjectGuid.h:145
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
@ SMSG_ACHIEVEMENT_DELETED
Definition Opcodes.h:1213

References _completedAchievements, _criteriaProgress, _player, CheckAllAchievementCriteria(), DeleteFromDB(), ObjectGuid::GetCounter(), Object::GetGUID(), Player::SendDirectMessage(), SMSG_ACHIEVEMENT_DELETED, and SMSG_CRITERIA_DELETED.

Referenced by Player::ResetAchievements().

◆ ResetAchievementCriteria()

void AchievementMgr::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
520{
521 // disable for gamemasters with GM-mode enabled
522 if (_player->IsGameMaster())
523 return;
525 return;
526
527 LOG_DEBUG("achievement", "AchievementMgr::ResetAchievementCriteria({}, {}, {})", condition, value, evenIfCriteriaComplete);
528
529 AchievementCriteriaEntryList const* achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByCondition(condition, value);
530 if (!achievementCriteriaList)
531 return;
532
533 for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList->begin(); i != achievementCriteriaList->end(); ++i)
534 {
535 AchievementCriteriaEntry const* achievementCriteria = (*i);
536 AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
537 if (!achievement)
538 continue;
539
540 // don't update already completed criteria if not forced or achievement already complete
541 if ((IsCompletedCriteria(achievementCriteria, achievement) && !evenIfCriteriaComplete) || HasAchieved(achievement->ID))
542 continue;
543
544 RemoveCriteriaProgress(achievementCriteria);
545 }
546}
uint32 referredAchievement
Definition DBCStructure.h:72
uint32 ID
Definition DBCStructure.h:41

References _player, Player::GetSession(), HasAchieved(), WorldSession::HasPermission(), AchievementEntry::ID, IsCompletedCriteria(), Player::IsGameMaster(), LOG_DEBUG, rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS, AchievementCriteriaEntry::referredAchievement, RemoveCriteriaProgress(), sAchievementMgr, and sAchievementStore.

Referenced by Player::ResetAchievementCriteria().

◆ SaveToDB()

void AchievementMgr::SaveToDB ( CharacterDatabaseTransaction  trans)
568{
569 if (!_completedAchievements.empty())
570 {
571 for (CompletedAchievementMap::iterator iter = _completedAchievements.begin(); iter != _completedAchievements.end(); ++iter)
572 {
573 if (!iter->second.changed)
574 continue;
575
577 stmt->SetData(0, iter->first);
578 stmt->SetData(1, GetPlayer()->GetGUID().GetCounter());
579 trans->Append(stmt);
580
581 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT);
582 stmt->SetData(0, GetPlayer()->GetGUID().GetCounter());
583 stmt->SetData(1, iter->first);
584 stmt->SetData(2, uint32(iter->second.date));
585 trans->Append(stmt);
586
587 iter->second.changed = false;
588
589 sScriptMgr->OnPlayerAchievementSave(trans, GetPlayer(), iter->first, iter->second);
590 }
591 }
592
593 if (!_criteriaProgress.empty())
594 {
595 for (CriteriaProgressMap::iterator iter = _criteriaProgress.begin(); iter != _criteriaProgress.end(); ++iter)
596 {
597 if (!iter->second.changed)
598 continue;
599
601 stmt->SetData(0, GetPlayer()->GetGUID().GetCounter());
602 stmt->SetData(1, iter->first);
603 trans->Append(stmt);
604
605 // pussywizard: insert only for (counter != 0) is very important! this is how criteria of completed achievements gets deleted from db (by setting counter to 0); if conflicted during merge - contact me
606 if (iter->second.counter)
607 {
608 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS);
609 stmt->SetData(0, GetPlayer()->GetGUID().GetCounter());
610 stmt->SetData(1, iter->first);
611 stmt->SetData(2, iter->second.counter);
612 stmt->SetData(3, uint32(iter->second.date));
613 trans->Append(stmt);
614 }
615
616 iter->second.changed = false;
617
618 sScriptMgr->OnPlayerCriteriaSave(trans, GetPlayer(), iter->first, iter->second);
619 }
620 }
621}
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA
Definition CharacterDatabase.h:370
@ CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS
Definition CharacterDatabase.h:371
@ CHAR_INS_CHAR_ACHIEVEMENT
Definition CharacterDatabase.h:369
@ CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT
Definition CharacterDatabase.h:398

References _completedAchievements, _criteriaProgress, CHAR_DEL_CHAR_ACHIEVEMENT_BY_ACHIEVEMENT, CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS_BY_CRITERIA, CHAR_INS_CHAR_ACHIEVEMENT, CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), GetPlayer(), PreparedStatementBase::SetData(), and sScriptMgr.

Referenced by Player::SaveToDB().

◆ SendAchievementEarned()

void AchievementMgr::SendAchievementEarned ( AchievementEntry const *  achievement) const
private
708{
709 if (GetPlayer()->GetSession()->PlayerLoading())
710 return;
711
712 // Don't send for achievements with ACHIEVEMENT_FLAG_TRACKING
713 if (achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
714 return;
715
716 LOG_DEBUG("achievement", "AchievementMgr::SendAchievementEarned({})", achievement->ID);
717
718 Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildId());
719 if (guild)
720 {
723 guild->BroadcastWorker(_localizer, GetPlayer());
724 }
725
727 {
728 // If guild exists - send its name to the server
729 // If guild does not exist - send player's name to the server
730 if (achievement->flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL && guild)
731 {
732 WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, guild->GetName().size() + 1 + 8 + 4 + 4);
733 data << guild->GetName();
734 data << GetPlayer()->GetGUID();
735 data << uint32(achievement->ID);
736 data << uint32(0); // display name as plain string in chat (always 0 for guild)
737 sWorldSessionMgr->SendGlobalMessage(&data);
738 }
739 else
740 {
741 TeamId teamId = GetPlayer()->GetTeamId();
742
743 // broadcast realm first reached
744 WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, GetPlayer()->GetName().size() + 1 + 8 + 4 + 4);
745 data << GetPlayer()->GetName();
746 data << GetPlayer()->GetGUID();
747 data << uint32(achievement->ID);
748 std::size_t linkTypePos = data.wpos();
749 data << uint32(1); // display name as clickable link in chat
750 sWorldSessionMgr->SendGlobalMessage(&data, nullptr, teamId);
751
752 data.put<uint32>(linkTypePos, 0); // display name as plain string in chat
753 sWorldSessionMgr->SendGlobalMessage(&data, nullptr, teamId == TEAM_ALLIANCE ? TEAM_HORDE : TEAM_ALLIANCE);
754 }
755 }
756 // if player is in world he can tell his friends about new achievement
757 else if (GetPlayer()->IsInWorld())
758 {
762 Cell::VisitObjects(GetPlayer(), _worker, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY));
763 }
764
765 WorldPacket data(SMSG_ACHIEVEMENT_EARNED, 8 + 4 + 8);
766 data << GetPlayer()->GetPackGUID();
767 data << uint32(achievement->ID);
768 data.AppendPackedTime(GameTime::GetGameTime().count());
769 data << uint32(0);
770 GetPlayer()->SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), true);
771}
#define sGuildMgr
Definition GuildMgr.h:51
@ BROADCAST_TEXT_ACHIEVEMENT_EARNED
Definition Language.h:23
@ CHAT_MSG_GUILD_ACHIEVEMENT
Definition SharedDefines.h:3434
@ CHAT_MSG_ACHIEVEMENT
Definition SharedDefines.h:3433
TeamId
Definition SharedDefines.h:747
@ CONFIG_LISTEN_RANGE_SAY
Definition WorldConfig.h:150
#define sWorldSessionMgr
Definition WorldSessionMgr.h:108
Definition ChatTextBuilder.h:31
Definition GridNotifiers.h:1737
Definition Guild.h:292
void BroadcastWorker(Do &_do, Player *except=nullptr)
Definition Guild.h:751
std::string const & GetName() const
Definition Guild.h:688
void SendMessageToSetInRange(WorldPacket const *data, float dist, bool self) const override
Definition Player.cpp:5674
TeamId GetTeamId(bool original=false) const
Definition Player.h:2128
std::string const & GetName() const
Definition Object.h:528
@ SMSG_ACHIEVEMENT_EARNED
Definition Opcodes.h:1158
@ SMSG_SERVER_FIRST_ACHIEVEMENT
Definition Opcodes.h:1206
#define sWorld
Definition World.h:317
Definition GridNotifiers.h:583
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References ACHIEVEMENT_FLAG_HIDDEN, ACHIEVEMENT_FLAG_REALM_FIRST_KILL, ACHIEVEMENT_FLAG_REALM_FIRST_REACH, ByteBuffer::AppendPackedTime(), BROADCAST_TEXT_ACHIEVEMENT_EARNED, Guild::BroadcastWorker(), CHAT_MSG_ACHIEVEMENT, CHAT_MSG_GUILD_ACHIEVEMENT, CONFIG_LISTEN_RANGE_SAY, AchievementEntry::flags, GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), Guild::GetName(), Object::GetPackGUID(), GetPlayer(), Player::GetTeamId(), AchievementEntry::ID, Object::IsInWorld(), LOG_DEBUG, ByteBuffer::put(), Player::SendMessageToSetInRange(), sGuildMgr, SMSG_ACHIEVEMENT_EARNED, SMSG_SERVER_FIRST_ACHIEVEMENT, sWorld, sWorldSessionMgr, TEAM_ALLIANCE, TEAM_HORDE, Cell::VisitObjects(), and ByteBuffer::wpos().

Referenced by CompletedAchievement().

◆ SendAllAchievementData()

void AchievementMgr::SendAllAchievementData ( ) const
2396{
2397 WorldPacket data(SMSG_ALL_ACHIEVEMENT_DATA, _completedAchievements.size() * 8 + 4 + _criteriaProgress.size() * 38 + 4);
2398 BuildAllDataPacket(&data);
2399 GetPlayer()->SendDirectMessage(&data);
2400}
void BuildAllDataPacket(WorldPacket *data) const
Definition AchievementMgr.cpp:2413
@ SMSG_ALL_ACHIEVEMENT_DATA
Definition Opcodes.h:1179

References _completedAchievements, _criteriaProgress, BuildAllDataPacket(), GetPlayer(), Player::SendDirectMessage(), and SMSG_ALL_ACHIEVEMENT_DATA.

Referenced by Player::SendInitialPacketsBeforeAddToMap().

◆ SendCriteriaUpdate()

void AchievementMgr::SendCriteriaUpdate ( AchievementCriteriaEntry const *  entry,
CriteriaProgress const *  progress,
uint32  timeElapsed,
bool  timedCompleted 
) const
private
774{
775 WorldPacket data(SMSG_CRITERIA_UPDATE, 8 + 4 + 8);
776 data << uint32(entry->ID);
777
778 // the counter is packed like a packed Guid
779 data.appendPackGUID(progress->counter);
780
781 data << GetPlayer()->GetPackGUID();
782 if (!entry->timeLimit)
783 data << uint32(0);
784 else
785 data << uint32(timedCompleted ? 0 : 1); // 1 is for keeping the counter at 0 in client
786 data.AppendPackedTime(progress->date);
787 data << uint32(timeElapsed); // time elapsed in seconds
788
789 if (sAchievementMgr->IsAverageCriteria(entry))
790 data << uint32(GameTime::GetGameTime().count() - GetPlayer()->GetCreationTime().count()); // for average achievements
791 else
792 data << uint32(timeElapsed); // time elapsed in seconds
793
795}
@ SMSG_CRITERIA_UPDATE
Definition Opcodes.h:1160

References ByteBuffer::AppendPackedTime(), ByteBuffer::appendPackGUID(), CriteriaProgress::counter, CriteriaProgress::date, GameTime::GetGameTime(), Object::GetPackGUID(), GetPlayer(), AchievementCriteriaEntry::ID, sAchievementMgr, Player::SendDirectMessage(), SMSG_CRITERIA_UPDATE, and AchievementCriteriaEntry::timeLimit.

Referenced by SetCriteriaProgress().

◆ SendRespondInspectAchievements()

void AchievementMgr::SendRespondInspectAchievements ( Player player) const

◆ SetCriteriaProgress()

void AchievementMgr::SetCriteriaProgress ( AchievementCriteriaEntry const *  entry,
uint32  changeValue,
ProgressType  ptype = PROGRESS_SET 
)
private
2111{
2112 // Don't allow to cheat - doing timed achievements without timer active
2113 TimedAchievementMap::iterator timedIter = _timedAchievements.find(entry->ID);
2114 if (entry->timeLimit && timedIter == _timedAchievements.end())
2115 return;
2116
2117 if (!sScriptMgr->OnPlayerBeforeCriteriaProgress(GetPlayer(), entry))
2118 {
2119 return;
2120 }
2121
2122 LOG_DEBUG("achievement", "AchievementMgr::SetCriteriaProgress({}, {}) for {}", entry->ID, changeValue, _player->GetGUID().ToString());
2123
2124 CriteriaProgress* progress = GetCriteriaProgress(entry);
2125 if (!progress)
2126 {
2127 // not create record for 0 counter but allow it for timed achievements
2128 // we will need to send 0 progress to client to start the timer
2129 if (changeValue == 0 && !entry->timeLimit)
2130 return;
2131
2132 progress = &_criteriaProgress[entry->ID];
2133 progress->counter = changeValue;
2134 }
2135 else
2136 {
2137 uint32 newValue = 0;
2138 switch (ptype)
2139 {
2140 case PROGRESS_SET:
2141 case PROGRESS_RESET:
2142 newValue = changeValue;
2143 break;
2145 {
2146 // avoid overflow
2147 uint32 max_value = std::numeric_limits<uint32>::max();
2148 newValue = max_value - progress->counter > changeValue ? progress->counter + changeValue : max_value;
2149 break;
2150 }
2151 case PROGRESS_HIGHEST:
2152 newValue = progress->counter < changeValue ? changeValue : progress->counter;
2153 break;
2154 }
2155
2156 // not update (not mark as changed) if counter will have same value
2157 if (ptype != PROGRESS_RESET && progress->counter == newValue && !entry->timeLimit)
2158 return;
2159
2160 progress->counter = newValue;
2161 }
2162
2163 progress->changed = true;
2164 progress->date = GameTime::GetGameTime().count(); // set the date to the latest update.
2165
2166 uint32 timeElapsed = 0;
2167 bool timedCompleted = false;
2168
2169 if (entry->timeLimit)
2170 {
2171 // has to exist else we wouldn't be here
2172 timedCompleted = IsCompletedCriteria(entry, sAchievementStore.LookupEntry(entry->referredAchievement));
2173 // Client expects this in packet
2174 timeElapsed = entry->timeLimit - (timedIter->second / IN_MILLISECONDS);
2175
2176 // Remove the timer, we wont need it anymore
2177 if (timedCompleted)
2178 _timedAchievements.erase(timedIter);
2179 }
2180
2181 SendCriteriaUpdate(entry, progress, timeElapsed, true);
2182
2183 sScriptMgr->OnPlayerCriteriaProgress(GetPlayer(), entry);
2184}
void SendCriteriaUpdate(AchievementCriteriaEntry const *entry, CriteriaProgress const *progress, uint32 timeElapsed, bool timedCompleted) const
Definition AchievementMgr.cpp:773
std::string ToString() const
Definition ObjectGuid.cpp:47

References _criteriaProgress, _player, _timedAchievements, CriteriaProgress::changed, CriteriaProgress::counter, CriteriaProgress::date, GetCriteriaProgress(), GameTime::GetGameTime(), Object::GetGUID(), GetPlayer(), AchievementCriteriaEntry::ID, IN_MILLISECONDS, IsCompletedCriteria(), LOG_DEBUG, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST, PROGRESS_RESET, PROGRESS_SET, AchievementCriteriaEntry::referredAchievement, sAchievementStore, SendCriteriaUpdate(), sScriptMgr, AchievementCriteriaEntry::timeLimit, and ObjectGuid::ToString().

Referenced by StartTimedAchievement(), and UpdateAchievementCriteria().

◆ StartTimedAchievement()

void AchievementMgr::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
2238{
2239 AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type);
2240 for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
2241 {
2242 if ((*i)->timerStartEvent != entry)
2243 continue;
2244
2245 AchievementEntry const* achievement = sAchievementStore.LookupEntry((*i)->referredAchievement);
2246 if (_timedAchievements.find((*i)->ID) == _timedAchievements.end() && !IsCompletedCriteria(*i, achievement))
2247 {
2248 // Start the timer
2249 if ((*i)->timeLimit * IN_MILLISECONDS > timeLost)
2250 {
2251 _timedAchievements[(*i)->ID] = (*i)->timeLimit * IN_MILLISECONDS - timeLost;
2252
2253 // and at client too
2255 }
2256 }
2257 }
2258}
void SetCriteriaProgress(AchievementCriteriaEntry const *entry, uint32 changeValue, ProgressType ptype=PROGRESS_SET)
Definition AchievementMgr.cpp:2110

References _timedAchievements, IN_MILLISECONDS, IsCompletedCriteria(), PROGRESS_SET, sAchievementMgr, sAchievementStore, and SetCriteriaProgress().

Referenced by Player::StartTimedAchievement().

◆ Update()

void AchievementMgr::Update ( uint32  timeDiff)
2200{
2202 {
2203 if (timeDiff >= _offlineUpdatesDelayTimer)
2204 {
2207 }
2208 else
2209 _offlineUpdatesDelayTimer -= timeDiff;
2210 }
2211
2212 UpdateTimedAchievements(timeDiff);
2213}
void UpdateTimedAchievements(uint32 timeDiff)
Definition AchievementMgr.cpp:2215
void ProcessOfflineUpdatesQueue()
Definition AchievementMgr.cpp:2496

References _offlineUpdatesDelayTimer, ProcessOfflineUpdatesQueue(), and UpdateTimedAchievements().

Referenced by Player::Update().

◆ UpdateAchievementCriteria()

void AchievementMgr::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)

this function will be called whenever the user might have done a criteria relevant action

823{
824 // disable for gamemasters with GM-mode enabled
825 if (_player->IsGameMaster())
826 return;
828 return;
829
831 {
832 LOG_DEBUG("achievement", "UpdateAchievementCriteria: Wrong criteria type {}", type);
833 return;
834 }
835
836 LOG_DEBUG("achievement", "AchievementMgr::UpdateAchievementCriteria({}, {}, {})", type, miscValue1, miscValue2);
837
838 AchievementCriteriaEntryList const* achievementCriteriaList = nullptr;
839
840 switch (type)
841 {
872 if (miscValue1)
873 {
874 achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue1);
875 break;
876 }
877 achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
878 break;
880 if (miscValue2)
881 {
882 achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue2);
883 break;
884 }
885 achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
886 break;
887 default:
888 achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
889 break;
890 }
891
892 if (!achievementCriteriaList)
893 return;
894
895 sScriptMgr->OnBeforeCheckCriteria(this, achievementCriteriaList);
896
897 for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList->begin(); i != achievementCriteriaList->end(); ++i)
898 {
899 AchievementCriteriaEntry const* achievementCriteria = (*i);
900 AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementCriteria->referredAchievement);
901 if (!achievement)
902 continue;
903
904 if (!CanUpdateCriteria(achievementCriteria, achievement))
905 continue;
906
907 if (!sScriptMgr->CanCheckCriteria(this, achievementCriteria))
908 continue;
909
910 switch (type)
911 {
912 // std. case: increment at 1
923 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
924 if (!miscValue1)
925 continue;
926 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
927 break;
928 // std case: increment at miscvalue1
940 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
941 if (!miscValue1)
942 continue;
943 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
944 break;
945 // std case: high value at miscvalue1
952 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
953 if (!miscValue1)
954 continue;
955 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
956 break;
957
958 // specialized cases
960 {
961 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
962 if (!miscValue1)
963 continue;
964
965 if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK)
966 {
967 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
968 if (!data || !data->Meets(GetPlayer(), nullptr))
969 continue;
970 }
971
972 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
973 break;
974 }
976 {
977 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
978 if (!miscValue1)
979 continue;
980 if (achievementCriteria->win_bg.bgMapID != GetPlayer()->GetMapId())
981 continue;
982
983 // those requirements couldn't be found in the dbc
984 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
985 if (!data || !data->Meets(GetPlayer(), unit))
986 continue;
987
988 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
989 break;
990 }
992 {
993 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
994 if (!miscValue1)
995 continue;
996 if (achievementCriteria->kill_creature.creatureID != miscValue1)
997 continue;
998
999 // those requirements couldn't be found in the dbc
1000 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1001 if (!data || !data->Meets(GetPlayer(), unit))
1002 continue;
1003
1004 SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
1005 break;
1006 }
1008 {
1009 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1010 if (!miscValue2)
1011 continue;
1012
1013 // those requirements couldn't be found in the dbc
1014 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1015 if (!data || !data->Meets(GetPlayer(), unit, miscValue1))
1016 continue;
1017
1018 SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
1019 break;
1020 }
1022 if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
1023 if (!data->Meets(GetPlayer(), unit))
1024 continue;
1025 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetLevel());
1026 break;
1028 // update at loading or specific skill update
1029 if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID)
1030 continue;
1031 if (uint32 skillvalue = GetPlayer()->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
1032 SetCriteriaProgress(achievementCriteria, skillvalue);
1033 break;
1035 // update at loading or specific skill update
1036 if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID)
1037 continue;
1038 if (uint32 maxSkillvalue = GetPlayer()->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID))
1039 SetCriteriaProgress(achievementCriteria, maxSkillvalue);
1040 break;
1042 if ((miscValue1 && achievementCriteria->complete_achievement.linkedAchievement == miscValue1) || (!miscValue1 && GetPlayer()->HasAchieved(achievementCriteria->complete_achievement.linkedAchievement)))
1043 SetCriteriaProgress(achievementCriteria, 1);
1044 break;
1046 {
1047 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetRewardedQuestCount());
1048 break;
1049 }
1051 {
1052 Seconds nextDailyResetTime = sWorld->GetNextDailyQuestsResetTime();
1053 CriteriaProgress* progress = GetCriteriaProgress(achievementCriteria);
1054
1055 if (!miscValue1) // Login case.
1056 {
1057 // reset if player missed one day.
1058 if (progress && Seconds(progress->date) < (nextDailyResetTime - 2_days))
1059 SetCriteriaProgress(achievementCriteria, 0, PROGRESS_SET);
1060 continue;
1061 }
1062
1063 ProgressType progressType;
1064 if (!progress)
1065 // 1st time. Start count.
1066 progressType = PROGRESS_SET;
1067 else if (Seconds(progress->date) < (nextDailyResetTime - 2_days))
1068 // last progress is older than 2 days. Player missed 1 day => Retart count.
1069 progressType = PROGRESS_RESET;
1070 else if (Seconds(progress->date) < (nextDailyResetTime - 1_days))
1071 // last progress is between 1 and 2 days. => 1st time of the day.
1072 progressType = PROGRESS_ACCUMULATE;
1073 else
1074 // last progress is within the day before the reset => Already counted today.
1075 continue;
1076
1077 SetCriteriaProgress(achievementCriteria, 1, progressType);
1078 break;
1079 }
1081 {
1082 // speedup for non-login case
1083 if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID)
1084 continue;
1085
1086 uint32 counter = 0;
1087
1088 const RewardedQuestSet& rewQuests = GetPlayer()->getRewardedQuests();
1089 for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr)
1090 {
1091 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
1092 if (quest && quest->GetZoneOrSort() >= 0 && uint32(quest->GetZoneOrSort()) == achievementCriteria->complete_quests_in_zone.zoneID && !(quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_LOREMASTER_COUNT)))
1093 ++counter;
1094 }
1095 SetCriteriaProgress(achievementCriteria, counter);
1096 break;
1097 }
1099 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1100 if (!miscValue1)
1101 continue;
1102 if (GetPlayer()->GetMapId() != achievementCriteria->complete_battleground.mapID)
1103 continue;
1104 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1105 break;
1107 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1108 if (!miscValue1)
1109 continue;
1110 if (GetPlayer()->GetMapId() != achievementCriteria->death_at_map.mapID)
1111 continue;
1112 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1113 break;
1115 {
1116 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1117 if (!miscValue1)
1118 continue;
1119 // skip wrong arena achievements, if not achievIdByArenaSlot then normal total death counter
1120 bool notfit = false;
1121 for (int j = 0; j < MAX_ARENA_SLOT; ++j)
1122 {
1123 if (achievIdByArenaSlot[j] == achievement->ID)
1124 {
1126 if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j)
1127 notfit = true;
1128
1129 break;
1130 }
1131 }
1132 if (notfit)
1133 continue;
1134
1135 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1136 break;
1137 }
1139 {
1140 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1141 if (!miscValue1)
1142 continue;
1143
1144 Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId());
1145 if (!map || !map->IsDungeon())
1146 continue;
1147
1148 // search case
1149 bool found = false;
1150 for (int j = 0; achievIdForDungeon[j][0]; ++j)
1151 {
1152 if (achievIdForDungeon[j][0] == achievement->ID)
1153 {
1154 if (map->IsRaid())
1155 {
1156 // if raid accepted (ignore difficulty)
1157 if (!achievIdForDungeon[j][2])
1158 break; // for
1159 }
1160 else if (GetPlayer()->GetDungeonDifficulty() == DUNGEON_DIFFICULTY_NORMAL)
1161 {
1162 // dungeon in normal mode accepted
1163 if (!achievIdForDungeon[j][1])
1164 break; // for
1165 }
1166 else
1167 {
1168 // dungeon in heroic mode accepted
1169 if (!achievIdForDungeon[j][3])
1170 break; // for
1171 }
1172
1173 found = true;
1174 break; // for
1175 }
1176 }
1177 if (!found)
1178 continue;
1179
1180 //FIXME: work only for instances where max == min for players
1181 if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit)
1182 continue;
1183 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1184 break;
1185 }
1187 {
1188 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1189 if (!miscValue1)
1190 continue;
1191
1192 Map const* map = GetPlayer()->IsInWorld() ? GetPlayer()->GetMap() : sMapMgr->FindMap(GetPlayer()->GetMapId(), GetPlayer()->GetInstanceId());
1193 if (!map || !map->IsDungeon())
1194 continue;
1195
1196 if (map->ToInstanceMap()->GetMaxPlayers() != achievementCriteria->complete_raid.groupSize)
1197 continue;
1198 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1199 break;
1200 }
1202 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1203 if (!miscValue1)
1204 continue;
1205 if (miscValue1 != achievementCriteria->killed_by_creature.creatureEntry)
1206 continue;
1207 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1208 break;
1210 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1211 if (!miscValue1)
1212 continue;
1213
1214 // if team check required: must kill by opposition faction
1215 if (achievement->ID == 318 && miscValue2 == GetPlayer()->GetTeamId())
1216 continue;
1217
1218 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1219 break;
1221 {
1222 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1223 if (!miscValue1)
1224 continue;
1225
1226 // those requirements couldn't be found in the dbc
1227 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1228 if (!data || !data->Meets(GetPlayer(), unit))
1229 continue;
1230
1231 // miscvalue1 is the ingame fallheight*100 as stored in dbc
1232 SetCriteriaProgress(achievementCriteria, miscValue1);
1233 break;
1234 }
1236 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1237 if (!miscValue1)
1238 continue;
1239 if (miscValue2 != achievementCriteria->death_from.type)
1240 continue;
1241 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1242 break;
1244 {
1245 // if miscvalues != 0, it contains the questID.
1246 if (miscValue1)
1247 {
1248 if (miscValue1 != achievementCriteria->complete_quest.questID)
1249 continue;
1250 }
1251 else
1252 {
1253 // login case.
1254 if (!GetPlayer()->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
1255 continue;
1256 }
1257
1258 if (AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria))
1259 if (!data->Meets(GetPlayer(), unit))
1260 continue;
1261
1262 SetCriteriaProgress(achievementCriteria, 1);
1263 break;
1264 }
1267 {
1268 if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID)
1269 continue;
1270
1271 // those requirements couldn't be found in the dbc
1272 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1273 if (!data)
1274 continue;
1275
1276 if (!data->Meets(GetPlayer(), unit))
1277 continue;
1278
1279 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1280 break;
1281 }
1284 {
1285 if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID)
1286 continue;
1287
1288 // those requirements couldn't be found in the dbc
1289 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1290 if (!data)
1291 continue;
1292
1293 if (!data->Meets(GetPlayer(), unit))
1294 continue;
1295
1296 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1297 break;
1298 }
1300 if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID)
1301 continue;
1302
1303 if (GetPlayer()->HasSpell(achievementCriteria->learn_spell.spellID))
1304 SetCriteriaProgress(achievementCriteria, 1);
1305 break;
1307 {
1308 // miscvalue1=loot_type (note: 0 = LOOT_CORPSE and then it ignored)
1309 // miscvalue2=count of item loot
1310 if (!miscValue1 || !miscValue2)
1311 continue;
1312 if (miscValue1 != achievementCriteria->loot_type.lootType)
1313 continue;
1314
1315 // zone specific
1316 if (achievementCriteria->loot_type.lootTypeCount == 1)
1317 {
1318 // those requirements couldn't be found in the dbc
1319 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1320 if (!data || !data->Meets(GetPlayer(), unit))
1321 continue;
1322 }
1323
1324 SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
1325 break;
1326 }
1328 // speedup for non-login case
1329 if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1)
1330 continue;
1331 SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
1332 break;
1334 if (!miscValue1) // no update at login
1335 continue;
1336
1337 // additional requirements
1339 {
1340 // those requirements couldn't be found in the dbc
1341 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1342 if (!data || !data->Meets(GetPlayer(), unit, miscValue1))
1343 {
1344 // reset the progress as we have a win without the requirement.
1345 SetCriteriaProgress(achievementCriteria, 0);
1346 continue;
1347 }
1348 }
1349
1350 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1351 break;
1353 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1354 if (!miscValue1)
1355 continue;
1356
1357 if (achievementCriteria->use_item.itemID != miscValue1)
1358 continue;
1359
1360 // Children's Week achievements have extra requirements
1361 //if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK || achievement->ID == 1291) // Lonely?
1362 {
1363 // Xinef: skip progress only if data exists and is not meet
1364 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1365 if (data && !data->Meets(GetPlayer(), nullptr))
1366 continue;
1367 }
1368
1369 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1370 break;
1372 // You _have_ to loot that item, just owning it when logging in does _not_ count!
1373 if (!miscValue1)
1374 continue;
1375 if (miscValue1 != achievementCriteria->own_item.itemID)
1376 continue;
1377 SetCriteriaProgress(achievementCriteria, miscValue2, PROGRESS_ACCUMULATE);
1378 break;
1380 {
1381 WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
1382 if (!worldOverlayEntry)
1383 break;
1384
1385 bool matchFound = false;
1386 for (int j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
1387 {
1388 AreaTableEntry const* area = sAreaTableStore.LookupEntry(worldOverlayEntry->areatableID[j]);
1389 if (!area)
1390 break;
1391
1392 uint32 playerIndexOffset = uint32(area->exploreFlag) / 32;
1393 if (playerIndexOffset >= PLAYER_EXPLORED_ZONES_SIZE)
1394 continue;
1395
1396 uint32 mask = 1 << (uint32(area->exploreFlag) % 32);
1397 if (GetPlayer()->GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + playerIndexOffset) & mask)
1398 {
1399 matchFound = true;
1400 break;
1401 }
1402 }
1403
1404 if (matchFound)
1405 SetCriteriaProgress(achievementCriteria, 1);
1406 break;
1407 }
1409 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetBankBagSlotCount());
1410 break;
1412 {
1413 // skip faction check only at loading
1414 if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID)
1415 continue;
1416
1417 int32 reputation = GetPlayer()->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID);
1418 if (reputation > 0)
1419 SetCriteriaProgress(achievementCriteria, reputation);
1420 break;
1421 }
1423 {
1424 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount());
1425 break;
1426 }
1428 {
1429 // skip for login case
1430 if (!miscValue1)
1431 continue;
1432 SetCriteriaProgress(achievementCriteria, 1);
1433 break;
1434 }
1436 {
1437 // miscvalue1 = itemid
1438 // miscvalue2 = itemSlot
1439 if (!miscValue1)
1440 continue;
1441
1442 if (miscValue2 != achievementCriteria->equip_epic_item.itemSlot)
1443 continue;
1444
1445 // check item level and quality via achievement_criteria_data
1446 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1447 if (!data || !data->Meets(GetPlayer(), 0, miscValue1))
1448 continue;
1449
1450 SetCriteriaProgress(achievementCriteria, 1);
1451 break;
1452 }
1453
1456 {
1457 // miscvalue1 = itemid
1458 // miscvalue2 = diced value
1459 if (!miscValue1)
1460 continue;
1461 if (miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue)
1462 continue;
1463
1464 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(miscValue1);
1465 if (!pProto)
1466 continue;
1467
1468 // check item level via achievement_criteria_data
1469 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1470 if (!data || !data->Meets(GetPlayer(), 0, pProto->ItemLevel))
1471 continue;
1472
1473 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1474 break;
1475 }
1477 {
1478 // miscvalue1 = emote
1479 if (!miscValue1)
1480 continue;
1481 if (miscValue1 != achievementCriteria->do_emote.emoteID)
1482 continue;
1483 if (achievementCriteria->do_emote.count)
1484 {
1485 // those requirements couldn't be found in the dbc
1486 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1487 if (!data || !data->Meets(GetPlayer(), unit))
1488 continue;
1489 }
1490
1491 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1492 break;
1493 }
1496 {
1497 if (!miscValue1)
1498 continue;
1499
1501 {
1502 if (GetPlayer()->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value)
1503 continue;
1504
1505 // map specific case (BG in fact) expected player targeted damage/heal
1506 if (!unit || !unit->IsPlayer())
1507 continue;
1508 }
1509
1510 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
1511 break;
1512 }
1514 // miscvalue1 = item_id
1515 if (!miscValue1)
1516 continue;
1517 if (miscValue1 != achievementCriteria->equip_item.itemID)
1518 continue;
1519
1520 SetCriteriaProgress(achievementCriteria, 1);
1521 break;
1523 // miscvalue1 = go entry
1524 if (!miscValue1)
1525 continue;
1526 if (miscValue1 != achievementCriteria->use_gameobject.goEntry)
1527 continue;
1528
1529 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1530 break;
1532 if (!miscValue1)
1533 continue;
1534 if (miscValue1 != achievementCriteria->fish_in_gameobject.goEntry)
1535 continue;
1536
1537 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1538 break;
1540 {
1541 if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine)
1542 continue;
1543
1544 uint32 spellCount = 0;
1545 for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); spellIter != GetPlayer()->GetSpellMap().end(); ++spellIter)
1546 {
1547 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter->first);
1548 for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
1549 {
1550 if (skillIter->second->SkillLine == achievementCriteria->learn_skillline_spell.skillLine)
1551 {
1552 // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
1553 ++spellCount;
1554 break;
1555 }
1556 }
1557 }
1558
1559 SetCriteriaProgress(achievementCriteria, spellCount);
1560 break;
1561 }
1563 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1564 if (!miscValue1)
1565 continue;
1566
1567 if (achievementCriteria->win_duel.duelCount)
1568 {
1569 // those requirements couldn't be found in the dbc
1570 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1571 if (!data)
1572 continue;
1573
1574 if (!data->Meets(GetPlayer(), unit))
1575 continue;
1576 }
1577
1578 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1579 break;
1581 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetReveredFactionCount());
1582 break;
1584 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetHonoredFactionCount());
1585 break;
1587 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetVisibleFactionCount());
1588 break;
1591 {
1592 // AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
1593 if (!miscValue1)
1594 continue;
1595 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(miscValue1);
1596 if (!proto || proto->Quality < ITEM_QUALITY_EPIC)
1597 continue;
1598 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1599 if (!data || !data->Meets(GetPlayer(), unit, miscValue1))
1600 continue;
1601 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1602 break;
1603 }
1605 {
1606 if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine)
1607 continue;
1608
1609 uint32 spellCount = 0;
1610 for (PlayerSpellMap::const_iterator spellIter = GetPlayer()->GetSpellMap().begin(); spellIter != GetPlayer()->GetSpellMap().end(); ++spellIter)
1611 {
1612 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter->first);
1613 for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
1614 {
1615 if (skillIter->second->SkillLine == achievementCriteria->learn_skill_line.skillLine)
1616 {
1617 // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
1618 ++spellCount;
1619 break;
1620 }
1621 }
1622 }
1623
1624 SetCriteriaProgress(achievementCriteria, spellCount);
1625 break;
1626 }
1628 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS));
1629 break;
1631 if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID)
1632 continue;
1633
1634 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1635 break;
1637 if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID)
1638 continue;
1639
1640 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1641 break;
1643 SetCriteriaProgress(achievementCriteria, GetPlayer()->GetMoney(), PROGRESS_HIGHEST);
1644 break;
1646 {
1647 if (!miscValue1)
1648 {
1649 uint32 points = 0;
1650 for (CompletedAchievementMap::iterator itr = _completedAchievements.begin(); itr != _completedAchievements.end(); ++itr)
1651 if (AchievementEntry const* pAchievement = sAchievementStore.LookupEntry(itr->first))
1652 points += pAchievement->points;
1653 SetCriteriaProgress(achievementCriteria, points, PROGRESS_SET);
1654 }
1655 else
1656 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_ACCUMULATE);
1657 break;
1658 }
1660 {
1661 if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId)
1662 continue;
1663
1664 // those requirements couldn't be found in the dbc
1665 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1666 if (!data || !data->Meets(GetPlayer(), unit))
1667 continue;
1668
1669 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1670 break;
1671 }
1675 {
1676 // skip login update
1677 if (!miscValue1)
1678 continue;
1679
1680 // those requirements couldn't be found in the dbc
1681 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1682 if (!data || !data->Meets(GetPlayer(), unit))
1683 continue;
1684
1685 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1686 break;
1687 }
1689 {
1690 if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID)
1691 continue;
1692
1693 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1694 break;
1695 }
1697 {
1698 uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype;
1699
1700 if (miscValue1)
1701 {
1702 if (miscValue2 != reqTeamType)
1703 continue;
1704
1705 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
1706 }
1707 else // login case
1708 {
1709 for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
1710 {
1711 uint32 arenaTeamId = GetPlayer()->GetArenaTeamId(arena_slot);
1712 if (!arenaTeamId)
1713 continue;
1714
1715 ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
1716 if (!team || team->GetType() != reqTeamType)
1717 continue;
1718
1719 SetCriteriaProgress(achievementCriteria, team->GetStats().Rating, PROGRESS_HIGHEST);
1720 break;
1721 }
1722 }
1723
1724 break;
1725 }
1727 {
1728 uint32 reqTeamType = achievementCriteria->highest_personal_rating.teamtype;
1729
1730 if (miscValue1)
1731 {
1732 if (miscValue2 != reqTeamType)
1733 continue;
1734
1735 SetCriteriaProgress(achievementCriteria, miscValue1, PROGRESS_HIGHEST);
1736 }
1737 else // login case
1738 {
1739 for (uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
1740 {
1741 uint32 arenaTeamId = GetPlayer()->GetArenaTeamId(arena_slot);
1742 if (!arenaTeamId)
1743 continue;
1744
1745 ArenaTeam* team = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
1746 if (!team || team->GetType() != reqTeamType)
1747 continue;
1748
1749 if (ArenaTeamMember const* member = team->GetMember(GetPlayer()->GetGUID()))
1750 {
1751 SetCriteriaProgress(achievementCriteria, member->PersonalRating, PROGRESS_HIGHEST);
1752 break;
1753 }
1754 }
1755 }
1756
1757 break;
1758 }
1760 {
1761 // This criteria is only called directly after login - with expected miscvalue1 == 1
1762 if (!miscValue1)
1763 continue;
1764
1765 // They have no proper requirements in dbc
1766 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1767 if (!data || !data->Meets(GetPlayer(), unit))
1768 continue;
1769
1770 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1771 break;
1772 }
1774 case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA
1775 {
1776 // those requirements couldn't be found in the dbc
1777 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1778 if (!data || !data->Meets(GetPlayer(), nullptr))
1779 continue;
1780
1781 // Check map id requirement
1782 if (miscValue1 == achievementCriteria->win_arena.mapID)
1783 SetCriteriaProgress(achievementCriteria, 1, PROGRESS_ACCUMULATE);
1784 break;
1785 }
1787 {
1788 // those requirements couldn't be found in the dbc
1789 AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
1790 if (!data || !data->Meets(GetPlayer(), nullptr))
1791 continue;
1792
1793 SetCriteriaProgress(achievementCriteria, 1);
1794 break;
1795 }
1796 // std case: not exist in DBC, not triggered in code as result
1803 break;
1804 // FIXME: not triggered in code as result, need to implement
1806 break; // Not implemented yet :(
1807 }
1808
1809 if (IsCompletedCriteria(achievementCriteria, achievement))
1810 CompletedCriteriaFor(achievement);
1811
1812 // check again the completeness for SUMM and REQ COUNT achievements,
1813 // as they don't depend on the completed criteria but on the sum of the progress of each individual criteria
1814 if (achievement->flags & ACHIEVEMENT_FLAG_SUMM)
1815 if (IsCompletedAchievement(achievement))
1816 CompletedAchievement(achievement);
1817
1818 if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID))
1819 for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
1820 if (IsCompletedAchievement(*itr))
1822 }
1823}
static const uint32 achievIdByArenaSlot[MAX_ARENA_SLOT]
Definition AchievementMgr.cpp:807
static const uint32 achievIdForDungeon[][4]
Definition AchievementMgr.cpp:808
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
#define MAX_ARENA_SLOT
Definition ArenaTeam.h:134
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE
Definition DBCEnums.h:91
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER
Definition DBCEnums.h:203
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED
Definition DBCEnums.h:209
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED
Definition DBCEnums.h:213
@ ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED
Definition DBCEnums.h:212
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition DBCEnums.h:176
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING
Definition DBCEnums.h:207
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED
Definition DBCEnums.h:211
@ ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED
Definition DBCEnums.h:210
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT
Definition DBCEnums.h:204
@ ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT
Definition DBCEnums.h:208
@ CATEGORY_CHILDRENS_WEEK
Definition DBCEnums.h:229
DBCStorage< WorldMapOverlayEntry > sWorldMapOverlayStore(WorldMapOverlayEntryfmt)
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
#define MAX_WORLD_MAP_OVERLAY_AREA_IDX
Definition DBCStructure.h:2162
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
#define sMapMgr
Definition MapMgr.h:220
#define sObjectMgr
Definition ObjectMgr.h:1723
std::unordered_set< uint32 > RewardedQuestSet
Definition Player.h:601
#define PLAYER_EXPLORED_ZONES_SIZE
Definition Player.h:73
@ QUEST_SPECIAL_FLAGS_NO_LOREMASTER_COUNT
Definition QuestDef.h:168
@ ITEM_QUALITY_EPIC
Definition SharedDefines.h:321
#define sSpellMgr
Definition SpellMgr.h:836
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition SpellMgr.h:586
@ PLAYER_EXPLORED_ZONES_1
Definition UpdateFields.h:357
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition UpdateFields.h:377
void CompletedCriteriaFor(AchievementEntry const *achievement)
Definition AchievementMgr.cpp:2024
ProgressType
Definition AchievementMgr.h:320
bool CanUpdateCriteria(AchievementCriteriaEntry const *criteria, AchievementEntry const *achievement)
Definition AchievementMgr.cpp:2452
Definition ArenaTeam.h:137
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition ArenaTeam.cpp:1021
uint32 GetType() const
Definition ArenaTeam.h:149
const ArenaTeamStats & GetStats() const
Definition ArenaTeam.h:155
static uint8 GetSlotByType(uint32 type)
Definition ArenaTeam.cpp:624
Definition Battleground.h:294
uint8 GetArenaType() const
Definition Battleground.h:348
bool isArena() const
Definition Battleground.h:404
uint32 GetMaxPlayers() const
Definition Map.cpp:2249
Definition Map.h:166
bool IsDungeon() const
Definition Map.h:297
bool IsRaid() const
Definition Map.h:299
InstanceMap * ToInstanceMap()
Definition Map.h:381
bool IsPlayer() const
Definition Object.h:201
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294
bool IsInWorld() const
Definition Object.h:109
RewardedQuestSet const & getRewardedQuests() const
Definition Player.h:1641
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12187
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1788
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16267
ReputationMgr & GetReputationMgr()
Definition Player.h:2145
Definition QuestDef.h:210
bool HasSpecialFlag(uint32 flag) const
Definition QuestDef.h:224
int32 GetZoneOrSort() const
Definition QuestDef.h:230
int32 GetReputation(uint32 faction_id) const
Definition ReputationMgr.cpp:78
Map * GetMap() const
Definition Object.h:625
Definition AchievementMgr.h:246
bool Meets(Player const *source, Unit const *target, uint32 miscvalue=0) const
Definition AchievementMgr.cpp:476
struct AchievementCriteriaEntry::@312::@339 own_item
uint32 areaReference
Definition DBCStructure.h:290
struct AchievementCriteriaEntry::@312::@360 equip_item
uint32 creatureEntry
Definition DBCStructure.h:166
struct AchievementCriteriaEntry::@312::@335 honorable_kill_at_area
uint32 skillLine
Definition DBCStructure.h:432
struct AchievementCriteriaEntry::@312::@343 learn_skill_level
struct AchievementCriteriaEntry::@312::@349 gain_reputation
struct AchievementCriteriaEntry::@312::@332 be_spell_target
uint32 objectiveId
Definition DBCStructure.h:208
struct AchievementCriteriaEntry::@312::@355 hk_class
struct AchievementCriteriaEntry::@312::@316 win_bg
uint32 bgMapID
Definition DBCStructure.h:87
struct AchievementCriteriaEntry::@312::@319 complete_achievement
struct AchievementCriteriaEntry::@312::@341 highest_team_rating
struct AchievementCriteriaEntry::@312::@328 killed_by_creature
uint32 manLimit
Definition DBCStructure.h:154
uint32 zoneID
Definition DBCStructure.h:128
uint32 itemID
Definition DBCStructure.h:241
uint32 mapID
Definition DBCStructure.h:142
struct AchievementCriteriaEntry::@312::@342 highest_personal_rating
uint32 rollValue
Definition DBCStructure.h:339
struct AchievementCriteriaEntry::@312::@372 loot_type
uint32 spellID
Definition DBCStructure.h:193
struct AchievementCriteriaEntry::@312::@356 hk_race
struct AchievementCriteriaEntry::@312::@330 death_from
uint32 groupSize
Definition DBCStructure.h:160
uint32 goEntry
Definition DBCStructure.h:410
struct AchievementCriteriaEntry::@312::@326 death_in_dungeon
uint32 emoteID
Definition DBCStructure.h:367
struct AchievementCriteriaEntry::@312::@352 equip_epic_item
uint32 skillID
Definition DBCStructure.h:101
uint32 lootTypeCount
Definition DBCStructure.h:471
struct AchievementCriteriaEntry::@312::@354 roll_greed_on_loot
struct AchievementCriteriaEntry::@312::@334 bg_objective
uint32 type
Definition DBCStructure.h:179
uint32 classID
Definition DBCStructure.h:352
uint32 lootType
Definition DBCStructure.h:470
struct AchievementCriteriaEntry::@312::@333 cast_spell
uint32 itemSlot
Definition DBCStructure.h:332
struct AchievementCriteriaEntry::@312::@373 learn_skill_line
struct AchievementCriteriaEntry::@312::@336 win_arena
struct AchievementCriteriaEntry::@312::@315 kill_creature
uint32 questID
Definition DBCStructure.h:185
uint32 duelCount
Definition DBCStructure.h:440
struct AchievementCriteriaEntry::@312::@324 complete_battleground
struct AchievementCriteriaEntry::@312::@322 complete_quests_in_zone
struct AchievementCriteriaEntry::@314 additionalRequirements[MAX_CRITERIA_REQUIREMENTS]
struct AchievementCriteriaEntry::@312::@366 learn_skillline_spell
struct AchievementCriteriaEntry::@312::@318 reach_skill_level
struct AchievementCriteriaEntry::@312::@365 fish_in_gameobject
struct AchievementCriteriaEntry::@312::@331 complete_quest
struct AchievementCriteriaEntry::@312::@338 learn_spell
struct AchievementCriteriaEntry::@312::@357 do_emote
struct AchievementCriteriaEntry::@312::@363 use_gameobject
uint32 raceID
Definition DBCStructure.h:359
struct AchievementCriteriaEntry::@312::@344 use_item
uint32 additionalRequirement_value
Definition DBCStructure.h:504
uint32 linkedAchievement
Definition DBCStructure.h:108
uint32 areaID
Definition DBCStructure.h:215
uint32 creatureID
Definition DBCStructure.h:80
struct AchievementCriteriaEntry::@312::@346 explore_area
uint32 additionalRequirement_type
Definition DBCStructure.h:503
struct AchievementCriteriaEntry::@312::@325 death_at_map
uint32 teamtype
Definition DBCStructure.h:255
struct AchievementCriteriaEntry::@312::@327 complete_raid
uint32 factionID
Definition DBCStructure.h:310
struct AchievementCriteriaEntry::@312::@367 win_duel
uint32 categoryId
Definition DBCStructure.h:49
Definition DBCStructure.h:519
uint32 exploreFlag
Definition DBCStructure.h:523
Definition ArenaTeam.h:108
uint16 Rating
Definition ArenaTeam.h:126
Definition ItemTemplate.h:619
uint32 Quality
Definition ItemTemplate.h:626
uint32 ItemLevel
Definition ItemTemplate.h:635
Definition DBCStructure.h:2165
uint32 areatableID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]
Definition DBCStructure.h:2168

References _completedAchievements, _player, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE, ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID, ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT, ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, 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_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA, ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED, ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_ROLL_DISENCHANT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, ACHIEVEMENT_CRITERIA_TYPE_TOTAL, ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, ACHIEVEMENT_FLAG_SUMM, achievIdByArenaSlot, achievIdForDungeon, AchievementCriteriaEntry::additionalRequirement_type, AchievementCriteriaEntry::additionalRequirement_value, AchievementCriteriaEntry::additionalRequirements, AchievementCriteriaEntry::areaID, AchievementCriteriaEntry::areaReference, WorldMapOverlayEntry::areatableID, AchievementCriteriaEntry::be_spell_target, AchievementCriteriaEntry::bg_objective, AchievementCriteriaEntry::bgMapID, CanUpdateCriteria(), AchievementCriteriaEntry::cast_spell, CATEGORY_CHILDRENS_WEEK, AchievementEntry::categoryId, AchievementCriteriaEntry::classID, AchievementCriteriaEntry::complete_achievement, AchievementCriteriaEntry::complete_battleground, AchievementCriteriaEntry::complete_quest, AchievementCriteriaEntry::complete_quests_in_zone, AchievementCriteriaEntry::complete_raid, CompletedAchievement(), CompletedCriteriaFor(), AchievementCriteriaEntry::count, AchievementCriteriaEntry::creatureEntry, AchievementCriteriaEntry::creatureID, CriteriaProgress::date, AchievementCriteriaEntry::death_at_map, AchievementCriteriaEntry::death_from, AchievementCriteriaEntry::death_in_dungeon, AchievementCriteriaEntry::do_emote, AchievementCriteriaEntry::duelCount, DUNGEON_DIFFICULTY_NORMAL, AchievementCriteriaEntry::emoteID, AchievementCriteriaEntry::equip_epic_item, AchievementCriteriaEntry::equip_item, AchievementCriteriaEntry::explore_area, AreaTableEntry::exploreFlag, AchievementCriteriaEntry::factionID, AchievementCriteriaEntry::fish_in_gameobject, AchievementEntry::flags, AchievementCriteriaEntry::gain_reputation, Player::GetArenaTeamId(), Battleground::GetArenaType(), Player::GetBattleground(), GetCriteriaProgress(), WorldObject::GetMap(), InstanceMap::GetMaxPlayers(), ArenaTeam::GetMember(), GetPlayer(), ReputationMgr::GetReputation(), Player::GetReputationMgr(), Player::getRewardedQuests(), Player::GetSession(), ArenaTeam::GetSlotByType(), Player::GetSpellMap(), ArenaTeam::GetStats(), GetTeamId(), ArenaTeam::GetType(), Object::GetUInt32Value(), Quest::GetZoneOrSort(), AchievementCriteriaEntry::goEntry, AchievementCriteriaEntry::groupSize, HasAchieved(), WorldSession::HasPermission(), Quest::HasSpecialFlag(), AchievementCriteriaEntry::highest_personal_rating, AchievementCriteriaEntry::highest_team_rating, AchievementCriteriaEntry::hk_class, AchievementCriteriaEntry::hk_race, AchievementCriteriaEntry::honorable_kill_at_area, AchievementEntry::ID, Battleground::isArena(), IsCompletedAchievement(), IsCompletedCriteria(), Map::IsDungeon(), Player::IsGameMaster(), Object::IsInWorld(), Object::IsPlayer(), Map::IsRaid(), ITEM_QUALITY_EPIC, AchievementCriteriaEntry::itemID, ItemTemplate::ItemLevel, 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_DEBUG, AchievementCriteriaEntry::loot_type, AchievementCriteriaEntry::lootType, AchievementCriteriaEntry::lootTypeCount, AchievementCriteriaEntry::manLimit, AchievementCriteriaEntry::mapID, MAX_ARENA_SLOT, MAX_WORLD_MAP_OVERLAY_AREA_IDX, AchievementCriteriaDataSet::Meets(), AchievementCriteriaEntry::objectiveId, AchievementCriteriaEntry::own_item, AchievementCriteriaEntry::PersonalRating, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST, PROGRESS_RESET, PROGRESS_SET, ItemTemplate::Quality, QUEST_SPECIAL_FLAGS_NO_LOREMASTER_COUNT, AchievementCriteriaEntry::questID, AchievementCriteriaEntry::raceID, ArenaTeamStats::Rating, rbac::RBAC_PERM_CANNOT_EARN_ACHIEVEMENTS, AchievementCriteriaEntry::reach_skill_level, AchievementCriteriaEntry::referredAchievement, AchievementCriteriaEntry::roll_greed_on_loot, AchievementCriteriaEntry::rollValue, sAchievementMgr, sAchievementStore, sAreaTableStore, sArenaTeamMgr, SetCriteriaProgress(), AchievementCriteriaEntry::skillID, AchievementCriteriaEntry::skillLine, sMapMgr, sObjectMgr, AchievementCriteriaEntry::spellID, sScriptMgr, sSpellMgr, sWorld, sWorldMapOverlayStore, AchievementCriteriaEntry::teamtype, Map::ToInstanceMap(), AchievementCriteriaEntry::type, AchievementCriteriaEntry::use_gameobject, AchievementCriteriaEntry::use_item, AchievementCriteriaEntry::win_arena, AchievementCriteriaEntry::win_bg, AchievementCriteriaEntry::win_duel, and AchievementCriteriaEntry::zoneID.

Referenced by CheckAllAchievementCriteria(), CompletedAchievement(), ProcessOfflineUpdate(), and Player::UpdateAchievementCriteria().

◆ UpdateTimedAchievements()

void AchievementMgr::UpdateTimedAchievements ( uint32  timeDiff)
private
2216{
2217 if (!_timedAchievements.empty())
2218 {
2219 for (TimedAchievementMap::iterator itr = _timedAchievements.begin(); itr != _timedAchievements.end();)
2220 {
2221 // Time is up, remove timer and reset progress
2222 if (itr->second <= timeDiff)
2223 {
2224 AchievementCriteriaEntry const* entry = sAchievementCriteriaStore.LookupEntry(itr->first);
2226 _timedAchievements.erase(itr++);
2227 }
2228 else
2229 {
2230 itr->second -= timeDiff;
2231 ++itr;
2232 }
2233 }
2234 }
2235}

References _timedAchievements, RemoveCriteriaProgress(), and sAchievementCriteriaStore.

Referenced by Update().

Member Data Documentation

◆ _completedAchievements

◆ _criteriaProgress

◆ _offlineUpdatesDelayTimer

uint32 AchievementMgr::_offlineUpdatesDelayTimer
private

Referenced by AchievementMgr(), LoadFromDB(), and Update().

◆ _offlineUpdatesQueue

std::vector<AchievementOfflinePlayerUpdate> AchievementMgr::_offlineUpdatesQueue
private

◆ _player

◆ _timedAchievements


The documentation for this class was generated from the following files: