[7297] Fixed profession spells sorting in trainer spell list at client.
[getmangos.git] / src / game / AchievementMgr.h
blob7c3b90cc1578369a7f1ec82cd07ccbcf2d571a14
1 /*
2 * Copyright (C) 2005-2009 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/DBCEnums.h"
24 #include "Database/DBCStores.h"
25 #include "Database/DatabaseEnv.h"
27 #include <map>
28 #include <string>
30 #define CRITERIA_CAST_SPELL_REQ_COUNT 46
31 #define ACHIEVEMENT_REWARD_COUNT 57
33 typedef std::list<const AchievementCriteriaEntry*> AchievementCriteriaEntryList;
35 struct CriteriaProgress
37 uint32 counter;
38 time_t date;
39 bool changed;
42 struct CriteriaCastSpellRequirement
44 uint32 achievementCriteriaId;
45 uint32 creatureEntry;
46 uint8 playerClass;
47 uint8 playerRace;
50 struct AchievementReward
52 uint32 titleId[2];
53 uint32 itemId;
54 uint32 sender;
55 std::string subject;
56 std::string text;
59 typedef std::map<uint32,AchievementReward> AchievementRewards;
61 struct AchievementRewardLocale
63 std::vector<std::string> subject;
64 std::vector<std::string> text;
67 typedef std::map<uint32,AchievementRewardLocale> AchievementRewardLocales;
70 struct CompletedAchievementData
72 time_t date;
73 bool changed;
76 typedef UNORDERED_MAP<uint32, CriteriaProgress> CriteriaProgressMap;
77 typedef UNORDERED_MAP<uint32, CompletedAchievementData> CompletedAchievementMap;
79 class Unit;
80 class Player;
81 class WorldPacket;
83 enum AchievementCompletionState
85 ACHIEVEMENT_COMPLETED_NONE,
86 ACHIEVEMENT_COMPLETED_COMPLETED_NOT_STORED,
87 ACHIEVEMENT_COMPLETED_COMPLETED_STORED,
90 class AchievementMgr
92 public:
93 AchievementMgr(Player* pl);
94 ~AchievementMgr();
96 void Reset();
97 static void DeleteFromDB(uint32 lowguid);
98 void LoadFromDB(QueryResult *achievementResult, QueryResult *criteriaResult);
99 void SaveToDB();
100 void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0);
101 void CheckAllAchievementCriteria();
102 void SendAllAchievementData();
103 void SendRespondInspectAchievements(Player* player);
104 Player* GetPlayer() { return m_player;}
106 private:
107 void SendAchievementEarned(AchievementEntry const* achievement);
108 void SendCriteriaUpdate(uint32 id, CriteriaProgress const* progress);
109 void SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative=false);
110 void CompletedCriteria(AchievementCriteriaEntry const* entry);
111 void CompletedAchievement(AchievementEntry const* entry);
112 bool IsCompletedCriteria(AchievementCriteriaEntry const* entry);
113 AchievementCompletionState GetAchievementCompletionState(AchievementEntry const* entry);
114 void BuildAllDataPacket(WorldPacket *data);
116 Player* m_player;
117 CriteriaProgressMap m_criteriaProgress;
118 CompletedAchievementMap m_completedAchievements;
121 class AchievementGlobalMgr
123 public:
124 AchievementCriteriaEntryList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type);
126 AchievementReward const* GetAchievementReward(AchievementEntry const* achievement) const
128 AchievementRewards::const_iterator iter = m_achievementRewards.find(achievement->ID);
129 return iter!=m_achievementRewards.end() ? &iter->second : NULL;
132 AchievementRewardLocale const* GetAchievementRewardLocale(AchievementEntry const* achievement) const
134 AchievementRewardLocales::const_iterator iter = m_achievementRewardLocales.find(achievement->ID);
135 return iter!=m_achievementRewardLocales.end() ? &iter->second : NULL;
138 static CriteriaCastSpellRequirement const * GetCriteriaCastSpellRequirement(AchievementCriteriaEntry const *achievementCriteria)
140 for (uint32 i=0; i < CRITERIA_CAST_SPELL_REQ_COUNT; ++i)
141 if (m_criteriaCastSpellRequirements[i].achievementCriteriaId == achievementCriteria->ID)
142 return &m_criteriaCastSpellRequirements[i];
144 return NULL;
147 bool IsRealmCompleted(AchievementEntry const* achievement) const
149 return m_allCompletedAchievements.find(achievement->ID) != m_allCompletedAchievements.end();
152 void SetRealmCompleted(AchievementEntry const* achievement)
154 m_allCompletedAchievements.insert(achievement->ID);
157 void LoadAchievementCriteriaList();
158 void LoadCompletedAchievements();
159 void LoadRewards();
160 void LoadRewardLocales();
161 private:
162 static const CriteriaCastSpellRequirement m_criteriaCastSpellRequirements[];
164 // store achievement criterias by type to speed up lookup
165 AchievementCriteriaEntryList m_AchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL];
167 typedef std::set<uint32> AllCompletedAchievements;
168 AllCompletedAchievements m_allCompletedAchievements;
170 AchievementRewards m_achievementRewards;
171 AchievementRewardLocales m_achievementRewardLocales;
174 #define achievementmgr MaNGOS::Singleton<AchievementGlobalMgr>::Instance()
176 #endif