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
22 #include "Policies/Singleton.h"
23 #include "Database/DatabaseEnv.h"
25 #include "DBCStores.h"
30 #define CRITERIA_CAST_SPELL_REQ_COUNT 46
31 #define ACHIEVEMENT_REWARD_COUNT 57
33 typedef std::list
<AchievementCriteriaEntry
const*> AchievementCriteriaEntryList
;
34 typedef std::list
<AchievementEntry
const*> AchievementEntryList
;
36 typedef std::map
<uint32
,AchievementCriteriaEntryList
> AchievementCriteriaListByAchievement
;
37 typedef std::map
<uint32
,AchievementEntryList
> AchievementListByReferencedId
;
39 struct CriteriaProgress
46 struct CriteriaCastSpellRequirement
48 uint32 achievementCriteriaId
;
54 struct AchievementReward
63 typedef std::map
<uint32
,AchievementReward
> AchievementRewards
;
65 struct AchievementRewardLocale
67 std::vector
<std::string
> subject
;
68 std::vector
<std::string
> text
;
71 typedef std::map
<uint32
,AchievementRewardLocale
> AchievementRewardLocales
;
74 struct CompletedAchievementData
80 typedef UNORDERED_MAP
<uint32
, CriteriaProgress
> CriteriaProgressMap
;
81 typedef UNORDERED_MAP
<uint32
, CompletedAchievementData
> CompletedAchievementMap
;
90 AchievementMgr(Player
* pl
);
94 static void DeleteFromDB(uint32 lowguid
);
95 void LoadFromDB(QueryResult
*achievementResult
, QueryResult
*criteriaResult
);
97 void UpdateAchievementCriteria(AchievementCriteriaTypes type
, uint32 miscvalue1
=0, uint32 miscvalue2
=0, Unit
*unit
=NULL
, uint32 time
=0);
98 void CheckAllAchievementCriteria();
99 void SendAllAchievementData();
100 void SendRespondInspectAchievements(Player
* player
);
101 Player
* GetPlayer() { return m_player
;}
104 enum ProgressType
{ PROGRESS_SET
, PROGRESS_ACCUMULATE
, PROGRESS_HIGHEST
};
105 void SendAchievementEarned(AchievementEntry
const* achievement
);
106 void SendCriteriaUpdate(uint32 id
, CriteriaProgress
const* progress
);
107 void SetCriteriaProgress(AchievementCriteriaEntry
const* entry
, uint32 changeValue
, ProgressType ptype
= PROGRESS_SET
);
108 void CompletedCriteria(AchievementCriteriaEntry
const* entry
, AchievementEntry
const* achievement
);
109 void CompletedAchievement(AchievementEntry
const* entry
);
110 bool IsCompletedCriteria(AchievementCriteriaEntry
const* criteria
, AchievementEntry
const* achievement
);
111 bool IsCompletedAchievement(AchievementEntry
const* entry
);
112 void CompleteAchievementsWithRefs(AchievementEntry
const* entry
);
113 void BuildAllDataPacket(WorldPacket
*data
);
116 CriteriaProgressMap m_criteriaProgress
;
117 CompletedAchievementMap m_completedAchievements
;
120 class AchievementGlobalMgr
123 AchievementCriteriaEntryList
const& GetAchievementCriteriaByType(AchievementCriteriaTypes type
);
124 AchievementCriteriaEntryList
const* GetAchievementCriteriaByAchievement(uint32 id
)
126 AchievementCriteriaListByAchievement::const_iterator itr
= m_AchievementCriteriaListByAchievement
.find(id
);
127 return itr
!= m_AchievementCriteriaListByAchievement
.end() ? &itr
->second
: NULL
;
130 AchievementEntryList
const* GetAchievementByReferencedId(uint32 id
) const
132 AchievementListByReferencedId::const_iterator itr
= m_AchievementListByReferencedId
.find(id
);
133 return itr
!= m_AchievementListByReferencedId
.end() ? &itr
->second
: NULL
;
136 AchievementReward
const* GetAchievementReward(AchievementEntry
const* achievement
) const
138 AchievementRewards::const_iterator iter
= m_achievementRewards
.find(achievement
->ID
);
139 return iter
!=m_achievementRewards
.end() ? &iter
->second
: NULL
;
142 AchievementRewardLocale
const* GetAchievementRewardLocale(AchievementEntry
const* achievement
) const
144 AchievementRewardLocales::const_iterator iter
= m_achievementRewardLocales
.find(achievement
->ID
);
145 return iter
!=m_achievementRewardLocales
.end() ? &iter
->second
: NULL
;
148 static CriteriaCastSpellRequirement
const * GetCriteriaCastSpellRequirement(AchievementCriteriaEntry
const *achievementCriteria
)
150 for (uint32 i
=0; i
< CRITERIA_CAST_SPELL_REQ_COUNT
; ++i
)
151 if (m_criteriaCastSpellRequirements
[i
].achievementCriteriaId
== achievementCriteria
->ID
)
152 return &m_criteriaCastSpellRequirements
[i
];
157 bool IsRealmCompleted(AchievementEntry
const* achievement
) const
159 return m_allCompletedAchievements
.find(achievement
->ID
) != m_allCompletedAchievements
.end();
162 void SetRealmCompleted(AchievementEntry
const* achievement
)
164 m_allCompletedAchievements
.insert(achievement
->ID
);
167 void LoadAchievementCriteriaList();
168 void LoadAchievementReferenceList();
169 void LoadCompletedAchievements();
171 void LoadRewardLocales();
173 static const CriteriaCastSpellRequirement m_criteriaCastSpellRequirements
[];
175 // store achievement criterias by type to speed up lookup
176 AchievementCriteriaEntryList m_AchievementCriteriasByType
[ACHIEVEMENT_CRITERIA_TYPE_TOTAL
];
177 // store achievement criterias by achievement to speed up lookup
178 AchievementCriteriaListByAchievement m_AchievementCriteriaListByAchievement
;
179 // store achievements by referenced achievement id to speed up lookup
180 AchievementListByReferencedId m_AchievementListByReferencedId
;
182 typedef std::set
<uint32
> AllCompletedAchievements
;
183 AllCompletedAchievements m_allCompletedAchievements
;
185 AchievementRewards m_achievementRewards
;
186 AchievementRewardLocales m_achievementRewardLocales
;
189 #define achievementmgr MaNGOS::Singleton<AchievementGlobalMgr>::Instance()