[9581] Fixed apply damage reduction to melee/ranged damage.
[getmangos.git] / src / game / AchievementMgr.h
blob69966d4af4cc7a547e27b807325afd2bb502dc1a
1 /*
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
21 #include "Common.h"
22 #include "Policies/Singleton.h"
23 #include "Database/DatabaseEnv.h"
24 #include "DBCEnums.h"
25 #include "DBCStores.h"
27 #include <map>
28 #include <string>
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
38 uint32 counter;
39 time_t date;
40 bool changed;
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
69 class Player;
70 class Unit;
72 struct AchievementCriteriaRequirement
74 AchievementCriteriaRequirementType requirementType;
75 union
77 // ACHIEVEMENT_CRITERIA_REQUIRE_NONE = 0 (no data)
78 // ACHIEVEMENT_CRITERIA_REQUIRE_T_CREATURE = 1
79 struct
81 uint32 id;
82 } creature;
83 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_CLASS_RACE = 2
84 struct
86 uint32 class_id;
87 uint32 race_id;
88 } classRace;
89 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_LESS_HEALTH = 3
90 struct
92 uint32 percent;
93 } health;
94 // ACHIEVEMENT_CRITERIA_REQUIRE_T_PLAYER_DEAD = 4
95 struct
97 uint32 own_team_flag;
98 } player_dead;
99 // ACHIEVEMENT_CRITERIA_REQUIRE_S_AURA = 5
100 // ACHIEVEMENT_CRITERIA_REQUIRE_T_AURA = 7
101 struct
103 uint32 spell_id;
104 uint32 effect_idx;
105 } aura;
106 // ACHIEVEMENT_CRITERIA_REQUIRE_S_AREA = 6
107 struct
109 uint32 id;
110 } area;
111 // ACHIEVEMENT_CRITERIA_REQUIRE_VALUE = 8
112 struct
114 uint32 minvalue;
115 } value;
116 // ACHIEVEMENT_CRITERIA_REQUIRE_T_LEVEL = 9
117 struct
119 uint32 minlevel;
120 } level;
121 // ACHIEVEMENT_CRITERIA_REQUIRE_T_GENDER = 10
122 struct
124 uint32 gender;
125 } gender;
126 // ACHIEVEMENT_CRITERIA_REQUIRE_DISABLED = 11 (no data)
127 // ACHIEVEMENT_CRITERIA_REQUIRE_MAP_DIFFICULTY = 12
128 struct
130 uint32 difficulty;
131 } difficulty;
132 // ACHIEVEMENT_CRITERIA_REQUIRE_MAP_PLAYER_COUNT = 13
133 struct
135 uint32 maxcount;
136 } map_players;
137 // ACHIEVEMENT_CRITERIA_REQUIRE_T_TEAM = 14
138 struct
140 uint32 team;
141 } team;
142 // ACHIEVEMENT_CRITERIA_REQUIRE_S_DRUNK = 15
143 struct
145 uint32 state;
146 } drunk;
147 // ACHIEVEMENT_CRITERIA_REQUIRE_HOLIDAY = 16
148 struct
150 uint32 id;
151 } holiday;
152 // ACHIEVEMENT_CRITERIA_REQUIRE_BG_LOSS_TEAM_SCORE= 17
153 struct
155 uint32 min_score;
156 uint32 max_score;
157 } bg_loss_team_score;
158 // ACHIEVEMENT_CRITERIA_REQUIRE_INSTANCE_SCRIPT = 18 (no data)
159 // ACHIEVEMENT_CRITERIA_REQUIRE_S_EQUIPED_ITEM = 19
160 struct
162 uint32 item_level;
163 uint32 item_quality;
164 } equipped_item;
165 // ...
166 struct
168 uint32 value1;
169 uint32 value2;
170 } raw;
173 AchievementCriteriaRequirement() : requirementType(ACHIEVEMENT_CRITERIA_REQUIRE_NONE)
175 raw.value1 = 0;
176 raw.value2 = 0;
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;}
197 private:
198 uint32 criteria_id;
199 Storage storage;
202 typedef std::map<uint32,AchievementCriteriaRequirementSet> AchievementCriteriaRequirementMap;
204 struct AchievementReward
206 uint32 titleId[2];
207 uint32 itemId;
208 uint32 sender;
209 std::string subject;
210 std::string text;
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
226 time_t date;
227 bool changed;
230 typedef UNORDERED_MAP<uint32, CriteriaProgress> CriteriaProgressMap;
231 typedef UNORDERED_MAP<uint32, CompletedAchievementData> CompletedAchievementMap;
233 class Unit;
234 class Player;
235 class WorldPacket;
237 class AchievementMgr
239 public:
240 AchievementMgr(Player* pl);
241 ~AchievementMgr();
243 void Reset();
244 static void DeleteFromDB(uint32 lowguid);
245 void LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult);
246 void SaveToDB();
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;}
254 private:
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);
266 Player* m_player;
267 CriteriaProgressMap m_criteriaProgress;
268 CompletedAchievementMap m_completedAchievements;
271 class AchievementGlobalMgr
273 public:
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();
319 void LoadRewards();
320 void LoadRewardLocales();
321 private:
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()
340 #endif