TrinityCore
Loading...
Searching...
No Matches
AchievementMgr.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __TRINITY_ACHIEVEMENTMGR_H
19#define __TRINITY_ACHIEVEMENTMGR_H
20
21#include "DatabaseEnvFwd.h"
22#include "DBCEnums.h"
23#include "DBCStores.h"
24#include "Duration.h"
25#include "ObjectGuid.h"
26#include <string>
27#include <unordered_map>
28#include <vector>
29
30class Player;
31class WorldObject;
32class WorldPacket;
33
34typedef std::vector<AchievementCriteriaEntry const*> AchievementCriteriaEntryList;
35typedef std::vector<AchievementEntry const*> AchievementEntryList;
36
37typedef std::unordered_map<uint32, AchievementCriteriaEntryList> AchievementCriteriaListByAchievement;
38typedef std::unordered_map<uint32, AchievementCriteriaEntryList> AchievementCriteriaListByMiscValue;
39typedef std::unordered_map<uint32, AchievementCriteriaEntryList> AchievementCriteriaListByCondition;
40typedef std::unordered_map<uint32, AchievementEntryList> AchievementListByReferencedId;
41
43{
45 time_t date; // latest update time.
46 bool changed;
47};
48
50{ // value1 value2 comment
55 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD = 4, // own_team 0 not corpse (not released body), own_team == false if enemy team expected
56 ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5, // spell_id effect_idx
58 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx
59 ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8, // minvalue value provided with achievement update must be not less that limit
60 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9, // minlevel minlevel of target
61 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10, // gender 0=male; 1=female
62 ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT = 11, // scripted requirement
63 ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY = 12, // difficulty normal/heroic difficulty for current event map
64 ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // count "with less than %u people in the zone"
65 ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14, // team HORDE(67), ALLIANCE(469)
66 ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15, // drunken_state 0 (enum DrunkenState) of player
67 ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16, // holiday_id 0 event in holiday time
68 ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range
69 ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
70 ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality
71 ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20, // map_id 0 player must be on map with id in map_id
73 ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // N login on day of N-th Birthday
74 ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // title_id known (pvp) title, values from dbc
77
79};
80
82{
84 union
85 {
86 // ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE = 0 (no data)
87 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE = 1
88 struct
89 {
92 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
93 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
94 struct
95 {
99 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3
100 struct
101 {
104 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD = 4
105 struct
106 {
109 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5
110 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7
111 struct
112 {
116 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA = 6
117 struct
118 {
119 uint32 id;
121 // ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8
122 struct
123 {
127 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9
128 struct
129 {
132 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10
133 struct
134 {
137 // ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT = 11 (no data)
138 // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY = 12
139 struct
140 {
143 // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13
144 struct
145 {
148 // ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14
149 struct
150 {
153 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15
154 struct
155 {
158 // ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16
159 struct
160 {
161 uint32 id;
163 // ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
164 struct
165 {
169 // ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data)
170 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19
171 struct
172 {
176 // ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20
177 struct
178 {
181 // ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22
182 struct
183 {
186 // ACHIEVEMENT_CRITERIA_DATA_TYPE_KNOWN_TITLE = 23
187 struct
188 {
191 // ACHIEVEMENT_CRITERIA_DATA_TYPE_GAME_EVENT = 24
192 struct
193 {
194 uint32 id;
196 // ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY = 25
197 struct
198 {
201 // raw
202 struct
203 {
207 };
209
211 {
212 raw.value1 = 0;
213 raw.value2 = 0;
214 ScriptId = 0;
215 }
216
217 AchievementCriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId) : dataType(AchievementCriteriaDataType(_dataType))
218 {
219 raw.value1 = _value1;
220 raw.value2 = _value2;
221 ScriptId = _scriptId;
222 }
223
224 bool IsValid(AchievementCriteriaEntry const* criteria);
225 bool Meets(uint32 criteria_id, Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
226};
227
229{
230 AchievementCriteriaDataSet() : criteria_id(0) { }
231 typedef std::vector<AchievementCriteriaData> Storage;
232 void Add(AchievementCriteriaData const& data) { storage.push_back(data); }
233 bool Meets(Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
234 void SetCriteriaId(uint32 id) {criteria_id = id;}
235 private:
238};
239
240typedef std::unordered_map<uint32, AchievementCriteriaDataSet> AchievementCriteriaDataMap;
241
251
252typedef std::unordered_map<uint32, AchievementReward> AchievementRewards;
253
255{
256 std::vector<std::string> Subject;
257 std::vector<std::string> Text;
258};
259
260typedef std::unordered_map<uint32, AchievementRewardLocale> AchievementRewardLocales;
261
263{
264 time_t date;
266};
267
268typedef std::unordered_map<uint32, CriteriaProgress> CriteriaProgressMap;
269typedef std::unordered_map<uint32, CompletedAchievementData> CompletedAchievementMap;
270
277
279{
280 public:
281 AchievementMgr(Player* player);
283
284 void Reset();
285 static void DeleteFromDB(ObjectGuid lowguid);
286 void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
288 void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete);
289 void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, WorldObject* ref = nullptr);
290 void CompletedAchievement(AchievementEntry const* entry);
291 void CheckAllAchievementCriteria();
292 void SendAllAchievementData() const;
293 void SendRespondInspectAchievements(Player* player) const;
294 bool HasAchieved(uint32 achievementId) const;
295 Player* GetPlayer() const { return m_player; }
296 void UpdateTimedAchievements(uint32 timeDiff);
297 void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
298 void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements
299
300 uint32 GetAchievementPoints() const { return m_achievementPoints; }
301 private:
302 void SendAchievementEarned(AchievementEntry const* achievement) const;
303 void SendCriteriaUpdate(AchievementCriteriaEntry const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const;
304 CriteriaProgress* GetCriteriaProgress(AchievementCriteriaEntry const* entry);
305 void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 changeValue, ProgressType ptype = PROGRESS_SET);
306 void RemoveCriteriaProgress(AchievementCriteriaEntry const* entry);
307 void CompletedCriteriaFor(AchievementEntry const* achievement);
308 bool IsCompletedCriteria(AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement);
309 bool IsCompletedAchievement(AchievementEntry const* entry);
310 bool CanUpdateCriteria(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, WorldObject const* ref);
311 void BuildAllDataPacket(Player const* receiver, WorldPacket* data) const;
312
313 bool ConditionsSatisfied(AchievementCriteriaEntry const* criteria) const;
314 bool RequirementsSatisfied(AchievementCriteriaEntry const* criteria, AchievementEntry const* achievement, uint32 miscValue1, uint32 miscValue2, WorldObject const* ref) const;
315
319 typedef std::map<uint32, uint32> TimedAchievementMap;
320 TimedAchievementMap m_timedAchievements; // Criteria id/time left in MS
322};
323
325{
328
329 public:
330 static char const* GetCriteriaTypeString(AchievementCriteriaTypes type);
331 static char const* GetCriteriaTypeString(uint32 type);
332
333 static AchievementGlobalMgr* instance();
334
335 AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type, uint32 miscValue) const;
336
338 {
339 return m_AchievementCriteriasByTimedType[type];
340 }
341
343 {
344 AchievementCriteriaListByCondition::const_iterator itr = m_AchievementCriteriasByCondition[condition].find(val);
345 return itr != m_AchievementCriteriasByCondition[condition].end() ? &itr->second : nullptr;
346 }
347
349 {
350 AchievementCriteriaListByAchievement::const_iterator itr = m_AchievementCriteriaListByAchievement.find(id);
351 return itr != m_AchievementCriteriaListByAchievement.end() ? &itr->second : nullptr;
352 }
353
355 {
356 AchievementListByReferencedId::const_iterator itr = m_AchievementListByReferencedId.find(id);
357 return itr != m_AchievementListByReferencedId.end() ? &itr->second : nullptr;
358 }
359
361 {
362 AchievementRewards::const_iterator iter = m_achievementRewards.find(achievement->ID);
363 return iter != m_achievementRewards.end() ? &iter->second : nullptr;
364 }
365
367 {
368 AchievementRewardLocales::const_iterator iter = m_achievementRewardLocales.find(achievement->ID);
369 return iter != m_achievementRewardLocales.end() ? &iter->second : nullptr;
370 }
371
373 {
374 AchievementCriteriaDataMap::const_iterator iter = m_criteriaDataMap.find(achievementCriteria->ID);
375 return iter != m_criteriaDataMap.end() ? &iter->second : nullptr;
376 }
377
378 bool IsRealmCompleted(AchievementEntry const* achievement) const;
379 void SetRealmCompleted(AchievementEntry const* achievement);
380
381 void LoadAchievementCriteriaList();
382 void LoadAchievementCriteriaData();
383 void LoadAchievementReferenceList();
384 void LoadCompletedAchievements();
385 void LoadRewards();
386 void LoadRewardLocales();
387 private:
389
390 // store achievement criterias by type to speed up lookup
392
394
395 // store achievement criterias split by misc values
397
399
401
402 // store achievement criterias by achievement to speed up lookup
404
405 // store achievements by referenced achievement id to speed up lookup
407
408 // store realm first achievements
409 // SystemTimePoint::min() is a placeholder value for realm firsts not yet completed
410 // SystemTimePoint::max() is a value assigned to realm firsts complete before worldserver started
411 std::unordered_map<uint32 /*achievementId*/, SystemTimePoint /*completionTime*/> _allCompletedAchievements;
412
415
416 friend class UnitTestDataLoader;
417};
418
419#define sAchievementMgr AchievementGlobalMgr::instance()
420
421#endif
ProgressType
@ PROGRESS_SET
@ PROGRESS_ACCUMULATE
@ PROGRESS_HIGHEST
std::unordered_map< uint32, AchievementRewardLocale > AchievementRewardLocales
std::unordered_map< uint32, AchievementReward > AchievementRewards
std::unordered_map< uint32, AchievementCriteriaDataSet > AchievementCriteriaDataMap
std::unordered_map< uint32, AchievementCriteriaEntryList > AchievementCriteriaListByCondition
std::unordered_map< uint32, AchievementEntryList > AchievementListByReferencedId
std::unordered_map< uint32, CriteriaProgress > CriteriaProgressMap
AchievementCriteriaDataType
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_NTH_BIRTHDAY
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AREA
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_GAME_EVENT
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_DIFFICULTY
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_DEAD
@ MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE
@ ACHIEVEMENT_CRITERIA_DATA_TYPE_S_ITEM_QUALITY
std::vector< AchievementCriteriaEntry const * > AchievementCriteriaEntryList
std::unordered_map< uint32, AchievementCriteriaEntryList > AchievementCriteriaListByAchievement
std::unordered_map< uint32, AchievementCriteriaEntryList > AchievementCriteriaListByMiscValue
std::unordered_map< uint32, CompletedAchievementData > CompletedAchievementMap
std::vector< AchievementEntry const * > AchievementEntryList
AchievementCriteriaTimedTypes
Definition DBCEnums.h:121
@ ACHIEVEMENT_TIMED_TYPE_MAX
Definition DBCEnums.h:129
AchievementCriteriaCondition
Definition DBCEnums.h:97
@ ACHIEVEMENT_CRITERIA_CONDITION_MAX
Definition DBCEnums.h:107
AchievementCriteriaTypes
Definition DBCEnums.h:133
#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL
Definition DBCEnums.h:238
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< PreparedResultSet > PreparedQueryResult
#define TC_GAME_API
Definition Define.h:114
uint32_t uint32
Definition Define.h:133
std::chrono::system_clock::time_point SystemTimePoint
Definition Duration.h:37
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
AchievementCriteriaDataSet const * GetCriteriaDataSet(AchievementCriteriaEntry const *achievementCriteria) const
AchievementCriteriaEntryList const & GetTimedAchievementCriteriaByType(AchievementCriteriaTimedTypes type) const
AchievementRewardLocale const * GetAchievementRewardLocale(AchievementEntry const *achievement) const
AchievementCriteriaEntryList const * GetAchievementCriteriaByCondition(AchievementCriteriaCondition condition, uint32 val)
AchievementCriteriaEntryList const * GetAchievementCriteriaByAchievement(uint32 id) const
AchievementCriteriaListByAchievement m_AchievementCriteriaListByAchievement
AchievementRewards m_achievementRewards
AchievementListByReferencedId m_AchievementListByReferencedId
AchievementReward const * GetAchievementReward(AchievementEntry const *achievement) const
AchievementRewardLocales m_achievementRewardLocales
static AchievementCriteriaEntryList const EmptyCriteriaList
AchievementEntryList const * GetAchievementByReferencedId(uint32 id) const
AchievementCriteriaDataMap m_criteriaDataMap
std::unordered_map< uint32, SystemTimePoint > _allCompletedAchievements
Player * GetPlayer() const
CriteriaProgressMap m_criteriaProgress
uint32 m_achievementPoints
std::map< uint32, uint32 > TimedAchievementMap
CompletedAchievementMap m_completedAchievements
uint32 GetAchievementPoints() const
TimedAchievementMap m_timedAchievements
void Add(AchievementCriteriaData const &data)
std::vector< AchievementCriteriaData > Storage
struct AchievementCriteriaData::@5::@24 birthday_login
struct AchievementCriteriaData::@5::@26 game_event
bool IsValid(AchievementCriteriaEntry const *criteria)
bool Meets(uint32 criteria_id, Player const *source, WorldObject const *target, uint32 miscValue1=0, uint32 miscValue2=0) const
struct AchievementCriteriaData::@5::@23 map_id
struct AchievementCriteriaData::@5::@10 player_dead
struct AchievementCriteriaData::@5::@21 bg_loss_team_score
struct AchievementCriteriaData::@5::@9 health
struct AchievementCriteriaData::@5::@14 level
AchievementCriteriaDataType dataType
struct AchievementCriteriaData::@5::@7 creature
struct AchievementCriteriaData::@5::@27 item
struct AchievementCriteriaData::@5::@22 equipped_item
struct AchievementCriteriaData::@5::@28 raw
struct AchievementCriteriaData::@5::@19 drunk
struct AchievementCriteriaData::@5::@8 classRace
struct AchievementCriteriaData::@5::@12 area
struct AchievementCriteriaData::@5::@25 known_title
struct AchievementCriteriaData::@5::@17 map_players
AchievementCriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId)
struct AchievementCriteriaData::@5::@20 holiday
struct AchievementCriteriaData::@5::@11 aura
std::vector< std::string > Text
std::vector< std::string > Subject