2 * Copyright (C) 2005-2010 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 #ifndef __MANGOS_ACHIEVEMENTMGR_H
19 #define __MANGOS_ACHIEVEMENTMGR_H
22 #include "Policies/Singleton.h"
23 #include "Database/DatabaseEnv.h"
25 #include "DBCStores.h"
30 typedef std::list
<AchievementCriteriaEntry
const*> AchievementCriteriaEntryList
;
31 typedef std::list
<AchievementEntry
const*> AchievementEntryList
;
33 typedef std::map
<uint32
,AchievementCriteriaEntryList
> AchievementCriteriaListByAchievement
;
34 typedef std::map
<uint32
,AchievementEntryList
> AchievementListByReferencedId
;
36 struct CriteriaProgress
43 enum AchievementCriteriaRequirementType
44 { // value1 value2 comment
45 ACHIEVEMENT_CRITERIA_REQUIRE_NONE
= 0, // 0 0
46 ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE
= 1, // creature_id 0
47 ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_CLASS_RACE
= 2, // class_id race_id
48 ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_LESS_HEALTH
= 3, // health_percent 0
49 ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_DEAD
= 4, // own_team 0 not corpse (not released body), own_team==false if enemy team expected
50 ACHIEVEMENT_CRITERIA_REQUIRE_S_AURA
= 5, // spell_id effect_idx
51 ACHIEVEMENT_CRITERIA_REQUIRE_S_AREA
= 6, // area id 0
52 ACHIEVEMENT_CRITERIA_REQUIRE_T_AURA
= 7, // spell_id effect_idx
53 ACHIEVEMENT_CRITERIA_REQUIRE_VALUE
= 8, // minvalue value provided with achievement update must be not less that limit
54 ACHIEVEMENT_CRITERIA_REQUIRE_T_LEVEL
= 9, // minlevel minlevel of target
55 ACHIEVEMENT_CRITERIA_REQUIRE_T_GENDER
= 10, // gender 0=male; 1=female
56 ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED
= 11, // used to prevent achievement creteria complete if not all requirement implemented and listed in table
57 ACHIEVEMENT_CRITERIA_REQUIRE_MAP_DIFFICULTY
= 12, // difficulty normal/heroic difficulty for current event map
58 ACHIEVEMENT_CRITERIA_REQUIRE_MAP_PLAYER_COUNT
= 13, // count "with less than %u people in the zone"
59 ACHIEVEMENT_CRITERIA_REQUIRE_T_TEAM
= 14, // team HORDE(67), ALLIANCE(469)
60 ACHIEVEMENT_CRITERIA_REQUIRE_S_DRUNK
= 15, // drunken_state 0 (enum DrunkenState) of player
61 ACHIEVEMENT_CRITERIA_REQUIRE_HOLIDAY
= 16, // holiday_id 0 event in holiday time
62 ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE
= 17, // min_score max_score player's team win bg and opposition team have team score in range
63 ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT
= 18, // 0 0 maker instance script call for check current criteria requirements fit
64 ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM_LVL
= 19, // item_level item_quality fir equipped item in slot `misc1` to item level and quality
67 #define MAX_ACHIEVEMENT_CRITERIA_REQUIREMENT_TYPE 20 // maximum value in AchievementCriteriaRequirementType enum
72 struct AchievementCriteriaRequirement
74 AchievementCriteriaRequirementType requirementType
;
77 // ACHIEVEMENT_CRITERIA_REQUIRE_NONE = 0 (no data)
78 // ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE = 1
83 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_CLASS_RACE = 2
89 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_LESS_HEALTH = 3
94 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_DEAD = 4
99 // ACHIEVEMENT_CRITERIA_REQUIRE_S_AURA = 5
100 // ACHIEVEMENT_CRITERIA_REQUIRE_T_AURA = 7
106 // ACHIEVEMENT_CRITERIA_REQUIRE_S_AREA = 6
111 // ACHIEVEMENT_CRITERIA_REQUIRE_VALUE = 8
116 // ACHIEVEMENT_CRITERIA_REQUIRE_T_LEVEL = 9
121 // ACHIEVEMENT_CRITERIA_REQUIRE_T_GENDER = 10
126 // ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED = 11 (no data)
127 // ACHIEVEMENT_CRITERIA_REQUIRE_MAP_DIFFICULTY = 12
132 // ACHIEVEMENT_CRITERIA_REQUIRE_MAP_PLAYER_COUNT = 13
137 // ACHIEVEMENT_CRITERIA_REQUIRE_T_TEAM = 14
142 // ACHIEVEMENT_CRITERIA_REQUIRE_S_DRUNK = 15
147 // ACHIEVEMENT_CRITERIA_REQUIRE_HOLIDAY = 16
152 // ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE= 17
157 } bg_loss_team_score
;
158 // ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT = 18 (no data)
159 // ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM = 19
173 AchievementCriteriaRequirement() : requirementType(ACHIEVEMENT_CRITERIA_REQUIRE_NONE
)
179 AchievementCriteriaRequirement(uint32 reqType
, uint32 _value1
, uint32 _value2
)
180 : requirementType(AchievementCriteriaRequirementType(reqType
))
182 raw
.value1
= _value1
;
183 raw
.value2
= _value2
;
186 bool IsValid(AchievementCriteriaEntry
const* criteria
);
187 bool Meets(uint32 criteria_id
, Player
const* source
, Unit
const* target
, uint32 miscvalue1
= 0) const;
190 struct AchievementCriteriaRequirementSet
192 AchievementCriteriaRequirementSet() : criteria_id(0) {}
193 typedef std::vector
<AchievementCriteriaRequirement
> Storage
;
194 void Add(AchievementCriteriaRequirement
const& data
) { storage
.push_back(data
); }
195 bool Meets(Player
const* source
, Unit
const* target
, uint32 miscvalue
= 0) const;
196 void SetCriteriaId(uint32 id
) {criteria_id
= id
;}
202 typedef std::map
<uint32
,AchievementCriteriaRequirementSet
> AchievementCriteriaRequirementMap
;
204 struct AchievementReward
213 typedef std::map
<uint32
,AchievementReward
> AchievementRewards
;
215 struct AchievementRewardLocale
217 std::vector
<std::string
> subject
;
218 std::vector
<std::string
> text
;
221 typedef std::map
<uint32
,AchievementRewardLocale
> AchievementRewardLocales
;
224 struct CompletedAchievementData
230 typedef UNORDERED_MAP
<uint32
, CriteriaProgress
> CriteriaProgressMap
;
231 typedef UNORDERED_MAP
<uint32
, CompletedAchievementData
> CompletedAchievementMap
;
240 AchievementMgr(Player
* pl
);
244 static void DeleteFromDB(uint32 lowguid
);
245 void LoadFromDB(QueryResult
*achievementResult
, QueryResult
*criteriaResult
);
247 void ResetAchievementCriteria(AchievementCriteriaTypes type
, uint32 miscvalue1
=0, uint32 miscvalue2
=0);
248 void UpdateAchievementCriteria(AchievementCriteriaTypes type
, uint32 miscvalue1
=0, uint32 miscvalue2
=0, Unit
*unit
=NULL
, uint32 time
=0);
249 void CheckAllAchievementCriteria();
250 void SendAllAchievementData();
251 void SendRespondInspectAchievements(Player
* player
);
252 Player
* GetPlayer() { return m_player
;}
255 enum ProgressType
{ PROGRESS_SET
, PROGRESS_ACCUMULATE
, PROGRESS_HIGHEST
};
256 void SendAchievementEarned(AchievementEntry
const* achievement
);
257 void SendCriteriaUpdate(uint32 id
, CriteriaProgress
const* progress
);
258 void SetCriteriaProgress(AchievementCriteriaEntry
const* entry
, uint32 changeValue
, ProgressType ptype
= PROGRESS_SET
);
259 void CompletedCriteriaFor(AchievementEntry
const* achievement
);
260 void CompletedAchievement(AchievementEntry
const* entry
);
261 bool IsCompletedCriteria(AchievementCriteriaEntry
const* criteria
, AchievementEntry
const* achievement
);
262 bool IsCompletedAchievement(AchievementEntry
const* entry
);
263 void CompleteAchievementsWithRefs(AchievementEntry
const* entry
);
264 void BuildAllDataPacket(WorldPacket
*data
);
267 CriteriaProgressMap m_criteriaProgress
;
268 CompletedAchievementMap m_completedAchievements
;
271 class AchievementGlobalMgr
274 AchievementCriteriaEntryList
const& GetAchievementCriteriaByType(AchievementCriteriaTypes type
);
275 AchievementCriteriaEntryList
const* GetAchievementCriteriaByAchievement(uint32 id
)
277 AchievementCriteriaListByAchievement::const_iterator itr
= m_AchievementCriteriaListByAchievement
.find(id
);
278 return itr
!= m_AchievementCriteriaListByAchievement
.end() ? &itr
->second
: NULL
;
281 AchievementEntryList
const* GetAchievementByReferencedId(uint32 id
) const
283 AchievementListByReferencedId::const_iterator itr
= m_AchievementListByReferencedId
.find(id
);
284 return itr
!= m_AchievementListByReferencedId
.end() ? &itr
->second
: NULL
;
287 AchievementReward
const* GetAchievementReward(AchievementEntry
const* achievement
) const
289 AchievementRewards::const_iterator iter
= m_achievementRewards
.find(achievement
->ID
);
290 return iter
!=m_achievementRewards
.end() ? &iter
->second
: NULL
;
293 AchievementRewardLocale
const* GetAchievementRewardLocale(AchievementEntry
const* achievement
) const
295 AchievementRewardLocales::const_iterator iter
= m_achievementRewardLocales
.find(achievement
->ID
);
296 return iter
!=m_achievementRewardLocales
.end() ? &iter
->second
: NULL
;
299 AchievementCriteriaRequirementSet
const* GetCriteriaRequirementSet(AchievementCriteriaEntry
const *achievementCriteria
)
301 AchievementCriteriaRequirementMap::const_iterator iter
= m_criteriaRequirementMap
.find(achievementCriteria
->ID
);
302 return iter
!=m_criteriaRequirementMap
.end() ? &iter
->second
: NULL
;
305 bool IsRealmCompleted(AchievementEntry
const* achievement
) const
307 return m_allCompletedAchievements
.find(achievement
->ID
) != m_allCompletedAchievements
.end();
310 void SetRealmCompleted(AchievementEntry
const* achievement
)
312 m_allCompletedAchievements
.insert(achievement
->ID
);
315 void LoadAchievementCriteriaList();
316 void LoadAchievementCriteriaRequirements();
317 void LoadAchievementReferenceList();
318 void LoadCompletedAchievements();
320 void LoadRewardLocales();
322 AchievementCriteriaRequirementMap m_criteriaRequirementMap
;
324 // store achievement criterias by type to speed up lookup
325 AchievementCriteriaEntryList m_AchievementCriteriasByType
[ACHIEVEMENT_CRITERIA_TYPE_TOTAL
];
326 // store achievement criterias by achievement to speed up lookup
327 AchievementCriteriaListByAchievement m_AchievementCriteriaListByAchievement
;
328 // store achievements by referenced achievement id to speed up lookup
329 AchievementListByReferencedId m_AchievementListByReferencedId
;
331 typedef std::set
<uint32
> AllCompletedAchievements
;
332 AllCompletedAchievements m_allCompletedAchievements
;
334 AchievementRewards m_achievementRewards
;
335 AchievementRewardLocales m_achievementRewardLocales
;
338 #define sAchievementMgr MaNGOS::Singleton<AchievementGlobalMgr>::Instance()