1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
/*
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __TRINITY_ACHIEVEMENTMGR_H
#define __TRINITY_ACHIEVEMENTMGR_H
#include "CriteriaHandler.h"
class Guild;
struct AchievementReward
{
uint32 TitleId[2];
uint32 ItemId;
uint32 SenderCreatureId;
std::string Subject;
std::string Body;
uint32 MailTemplateId;
};
struct AchievementRewardLocale
{
std::vector<std::string> Subject;
std::vector<std::string> Body;
};
struct CompletedAchievementData
{
std::time_t Date = std::time_t(0);
GuidSet CompletingPlayers;
bool Changed;
};
class TC_GAME_API AchievementMgr : public CriteriaHandler
{
public:
AchievementMgr();
~AchievementMgr();
void CheckAllAchievementCriteria(Player* referencePlayer);
virtual void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) = 0;
bool HasAchieved(uint32 achievementId) const;
uint32 GetAchievementPoints() const;
protected:
bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const override;
bool CanCompleteCriteriaTree(CriteriaTree const* tree) override;
void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) override;
void AfterCriteriaTreeUpdate(CriteriaTree const* tree, Player* referencePlayer) override;
bool IsCompletedAchievement(AchievementEntry const* entry);
bool RequiredAchievementSatisfied(uint32 achievementId) const override;
protected:
std::unordered_map<uint32, CompletedAchievementData> _completedAchievements;
uint32 _achievementPoints;
};
class TC_GAME_API PlayerAchievementMgr : public AchievementMgr
{
public:
explicit PlayerAchievementMgr(Player* owner);
void Reset() override;
static void DeleteFromDB(ObjectGuid const& guid);
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
void SaveToDB(SQLTransaction& trans);
void ResetCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
void SendAllData(Player const* receiver) const override;
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) override;
bool ModifierTreeSatisfied(uint32 modifierTreeId) const;
protected:
void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override;
void SendCriteriaProgressRemoved(uint32 criteriaId) override;
void SendAchievementEarned(AchievementEntry const* achievement) const;
void SendPacket(WorldPacket const* data) const override;
std::string GetOwnerInfo() const override;
CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
private:
Player* _owner;
};
class TC_GAME_API GuildAchievementMgr : public AchievementMgr
{
public:
explicit GuildAchievementMgr(Guild* owner);
void Reset() override;
static void DeleteFromDB(ObjectGuid const& guid);
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
void SaveToDB(SQLTransaction& trans);
void SendAllData(Player const* receiver) const override;
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) override;
protected:
void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override;
void SendCriteriaProgressRemoved(uint32 criteriaId) override;
void SendAchievementEarned(AchievementEntry const* achievement) const;
void SendPacket(WorldPacket const* data) const override;
std::string GetOwnerInfo() const override;
CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
private:
Guild* _owner;
};
class TC_GAME_API AchievementGlobalMgr
{
AchievementGlobalMgr() { }
~AchievementGlobalMgr() { }
public:
static AchievementGlobalMgr* Instance();
std::vector<AchievementEntry const*> const* GetAchievementByReferencedId(uint32 id) const;
AchievementReward const* GetAchievementReward(AchievementEntry const* achievement) const;
AchievementRewardLocale const* GetAchievementRewardLocale(AchievementEntry const* achievement) const;
bool IsRealmCompleted(AchievementEntry const* achievement) const;
void SetRealmCompleted(AchievementEntry const* achievement);
void LoadAchievementReferenceList();
void LoadCompletedAchievements();
void LoadRewards();
void LoadRewardLocales();
private:
// store achievements by referenced achievement id to speed up lookup
std::unordered_map<uint32, std::vector<AchievementEntry const*>> _achievementListByReferencedId;
// store realm first achievements
// std::chrono::system_clock::time_point::min() is a placeholder value for realm firsts not yet completed
// std::chrono::system_clock::time_point::max() is a value assigned to realm firsts complete before worldserver started
std::unordered_map<uint32 /*achievementId*/, std::chrono::system_clock::time_point /*completionTime*/> _allCompletedAchievements;
std::unordered_map<uint32, AchievementReward> _achievementRewards;
std::unordered_map<uint32, AchievementRewardLocale> _achievementRewardLocales;
};
#define sAchievementMgr AchievementGlobalMgr::Instance()
#endif
|