TrinityCore
CriteriaHandler.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef CriteriaHandler_h__
19#define CriteriaHandler_h__
20
21#include "Common.h"
22#include "DBCEnums.h"
23#include "Duration.h"
24#include "ObjectGuid.h"
25#include <span>
26#include <unordered_map>
27#include <vector>
28#include <ctime>
29
30class Player;
31class WorldObject;
32class WorldPacket;
33struct AchievementEntry;
34struct CriteriaEntry;
37struct QuestObjective;
39
41{
43 std::vector<ModifierTreeNode const*> Children;
44};
45
47{
53};
54
56{
58 CriteriaEntry const* Entry = nullptr;
59 ModifierTreeNode const* Modifier = nullptr;
61};
62
63typedef std::vector<Criteria const*> CriteriaList;
64typedef std::unordered_map<uint32, CriteriaList> CriteriaListByAsset;
65
67{
69 CriteriaTreeEntry const* Entry = nullptr;
70 AchievementEntry const* Achievement = nullptr;
73 ::Criteria const* Criteria = nullptr;
74 std::vector<CriteriaTree const*> Children;
75};
76
77typedef std::vector<CriteriaTree const*> CriteriaTreeList;
78
80{
82 std::time_t Date = std::time_t(0); // latest update time.
83 ObjectGuid PlayerGUID; // GUID of the player that last updated the criteria
84 bool Changed = false;
85};
86
88{ // value1 value2 comment
90 CRITERIA_DATA_TYPE_T_CREATURE = 1, // CreatureId 0
93 CRITERIA_DATA_TYPE_S_AURA = 5, // SpellId EffectIndex
94 CRITERIA_DATA_TYPE_T_AURA = 7, // SpellId EffectIndex
95 CRITERIA_DATA_TYPE_VALUE = 8, // Minvalue value provided with update must be not less that limit
96 CRITERIA_DATA_TYPE_T_LEVEL = 9, // Minlevel minlevel of target
97 CRITERIA_DATA_TYPE_T_GENDER = 10, // Gender 0=male; 1=female
98 CRITERIA_DATA_TYPE_SCRIPT = 11, // Scripted requirement
99 CRITERIA_DATA_TYPE_MAP_DIFFICULTY = 12, // used on 3.3.5a branch
100 CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // Count "with less than %u people in the zone"
101 CRITERIA_DATA_TYPE_T_TEAM = 14, // Team HORDE(67), ALLIANCE(469)
102 CRITERIA_DATA_TYPE_S_DRUNK = 15, // DrunkenState 0 (enum DrunkenState) of player
103 CRITERIA_DATA_TYPE_HOLIDAY = 16, // HolidayId 0 event in holiday time
104 CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // MinScore MaxScore player's team win bg and opposition team have team score in range
105 CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
106 CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19, // ItemLevel Quality for equipped item in slot to check item level and quality
107 CRITERIA_DATA_TYPE_MAP_ID = 20, // MapId 0 player must be on map with id in map_id
109 CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // used on 3.3.5a branch
110 CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // TitleId known (pvp) title, values from dbc
111 CRITERIA_DATA_TYPE_GAME_EVENT = 24, // GameEventId 0
113
116
118{
120 union
121 {
122 // CRITERIA_DATA_TYPE_NONE = 0 (no data)
123 // CRITERIA_DATA_TYPE_T_CREATURE = 1
124 struct
125 {
128 // CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
129 // CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
130 struct
131 {
135 // CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3
136 struct
137 {
140 // CRITERIA_DATA_TYPE_S_AURA = 5
141 // CRITERIA_DATA_TYPE_T_AURA = 7
142 struct
143 {
147 // CRITERIA_DATA_TYPE_VALUE = 8
148 struct
149 {
153 // CRITERIA_DATA_TYPE_T_LEVEL = 9
154 struct
155 {
158 // CRITERIA_DATA_TYPE_T_GENDER = 10
159 struct
160 {
163 // CRITERIA_DATA_TYPE_SCRIPT = 11 (no data)
164 // CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13
165 struct
166 {
169 // CRITERIA_DATA_TYPE_T_TEAM = 14
170 struct
171 {
174 // CRITERIA_DATA_TYPE_S_DRUNK = 15
175 struct
176 {
179 // CRITERIA_DATA_TYPE_HOLIDAY = 16
180 struct
181 {
182 uint32 Id;
184 // CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
185 struct
186 {
187 uint32 Min;
190 // CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data)
191 // CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19
192 struct
193 {
197 // CRITERIA_DATA_TYPE_MAP_ID = 20
198 struct
199 {
200 uint32 Id;
202 // CRITERIA_DATA_TYPE_KNOWN_TITLE = 23
203 struct
204 {
205 uint32 Id;
207 // CRITERIA_DATA_TYPE_GAME_EVENT = 25
208 struct
209 {
210 uint32 Id;
212 // CRITERIA_DATA_TYPE_S_ITEM_QUALITY = 24
213 struct
214 {
217 // raw
218 struct
219 {
223 };
225
227 {
228 Raw.Value1 = 0;
229 Raw.Value2 = 0;
230 ScriptId = 0;
231 }
232
233 CriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId) : DataType(CriteriaDataType(_dataType))
234 {
235 Raw.Value1 = _value1;
236 Raw.Value2 = _value2;
237 ScriptId = _scriptId;
238 }
239
240 bool IsValid(Criteria const* criteria);
241 bool Meets(uint32 criteriaId, Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
242};
243
245{
247 void Add(CriteriaData const& data) { _storage.push_back(data); }
248 bool Meets(Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
250private:
252 std::vector<CriteriaData> _storage;
253};
254
255typedef std::unordered_map<uint32, CriteriaProgress> CriteriaProgressMap;
256
258{
263
265{
266public:
268 virtual ~CriteriaHandler();
269
270 CriteriaHandler(CriteriaHandler const& right) = delete;
274
275 virtual void Reset();
276
277 void UpdateCriteria(CriteriaType type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, WorldObject const* ref = nullptr, Player* referencePlayer = nullptr);
278
279 virtual void SendAllData(Player const* receiver) const = 0;
280
281 void UpdateTimedCriteria(Milliseconds timeDiff);
282 void StartCriteria(CriteriaStartEvent startEvent, uint32 entry, Milliseconds timeLost = Milliseconds::zero());
283 virtual void FailCriteria(CriteriaFailEvent failEvent, uint32 asset);
284
285protected:
286 virtual void SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, Seconds timeElapsed, bool timedCompleted) const = 0;
287
288 void UpdateCriteria(Criteria const* criteria, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, WorldObject const* ref = nullptr, Player* referencePlayer = nullptr);
289 CriteriaProgress* GetCriteriaProgress(Criteria const* entry);
290 void SetCriteriaProgress(Criteria const* criteria, uint64 changeValue, Player* referencePlayer, ProgressType progressType = PROGRESS_SET);
291 void RemoveCriteriaProgress(Criteria const* criteria);
292 virtual void SendCriteriaProgressRemoved(uint32 criteriaId) = 0;
293
294 bool IsCompletedCriteriaTree(CriteriaTree const* tree);
295 virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const;
296 virtual bool CanCompleteCriteriaTree(CriteriaTree const* tree);
297 virtual void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) = 0;
298 virtual void AfterCriteriaTreeUpdate(CriteriaTree const* /*tree*/, Player* /*referencePlayer*/) { }
299
300 bool IsCompletedCriteria(Criteria const* criteria, uint64 requiredAmount);
301 bool CanUpdateCriteria(Criteria const* criteria, CriteriaTreeList const* trees, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, WorldObject const* ref, Player* referencePlayer);
302
303 virtual void SendPacket(WorldPacket const* data) const = 0;
304
305 bool ConditionsSatisfied(Criteria const* criteria, Player* referencePlayer) const;
306 bool RequirementsSatisfied(Criteria const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, WorldObject const* ref, Player* referencePlayer) const;
307 virtual bool RequiredAchievementSatisfied(uint32 /*achievementId*/) const { return false; }
308 bool ModifierTreeSatisfied(ModifierTreeNode const* parent, uint64 miscValue1, uint64 miscValue2, WorldObject const* ref, Player* referencePlayer) const;
309 bool ModifierSatisfied(ModifierTreeEntry const* modifier, uint64 miscValue1, uint64 miscValue2, WorldObject const* ref, Player* referencePlayer) const;
310
311 virtual std::string GetOwnerInfo() const = 0;
312 virtual CriteriaList const& GetCriteriaByType(CriteriaType type, uint32 asset) const = 0;
313
315 std::unordered_map<uint32 /*criteriaID*/, Milliseconds /*time left*/> _startedCriteria;
316};
317
319{
321 ~CriteriaMgr();
322
323public:
324 CriteriaMgr(CriteriaMgr const& right) = delete;
325 CriteriaMgr(CriteriaMgr&& right) = delete;
326 CriteriaMgr& operator=(CriteriaMgr const& right) = delete;
328
329 static char const* GetCriteriaTypeString(CriteriaType type);
330 static char const* GetCriteriaTypeString(uint32 type);
331
332 static CriteriaMgr* Instance();
333
334 CriteriaList const& GetPlayerCriteriaByType(CriteriaType type, uint32 asset) const;
335
337 {
338 return _guildCriteriasByType[size_t(type)];
339 }
340
341 CriteriaList const& GetScenarioCriteriaByTypeAndScenario(CriteriaType type, uint32 scenarioId) const;
342
344 {
345 return _questObjectiveCriteriasByType[size_t(type)];
346 }
347
349 {
350 auto itr = _criteriaTreeByCriteria.find(criteriaId);
351 return itr != _criteriaTreeByCriteria.end() ? &itr->second : nullptr;
352 }
353
354 std::unordered_map<int32, CriteriaList> const& GetCriteriaByStartEvent(CriteriaStartEvent startEvent) const;
355 CriteriaList const* GetCriteriaByStartEvent(CriteriaStartEvent startEvent, int32 asset) const;
356
357 std::unordered_map<int32, CriteriaList> const& GetCriteriaByFailEvent(CriteriaFailEvent failEvent) const;
358 CriteriaList const* GetCriteriaByFailEvent(CriteriaFailEvent failEvent, int32 asset) const;
359
361 {
362 auto iter = _criteriaDataMap.find(Criteria->ID);
363 return iter != _criteriaDataMap.end() ? &iter->second : nullptr;
364 }
365
367 {
368 switch (type)
369 {
372 case CriteriaType::BeSpellTarget: // NYI
374 case CriteriaType::GainAura: // NYI
376 return true;
377 default:
378 break;
379 }
380
381 return false;
382 }
383
384 template<typename Func>
385 static void WalkCriteriaTree(CriteriaTree const* tree, Func const& func)
386 {
387 for (CriteriaTree const* node : tree->Children)
388 WalkCriteriaTree(node, func);
389
390 func(tree);
391 }
392
393 void LoadCriteriaModifiersTree();
394 void LoadCriteriaList();
395 void LoadCriteriaData();
396 CriteriaTree const* GetCriteriaTree(uint32 criteriaTreeId) const;
397 Criteria const* GetCriteria(uint32 criteriaId) const;
398 ModifierTreeNode const* GetModifierTree(uint32 modifierTreeId) const;
399
400 static std::span<CriteriaType const> GetRetroactivelyUpdateableCriteriaTypes();
401
402private:
403 std::unordered_map<uint32, CriteriaDataSet> _criteriaDataMap;
404
405 std::unordered_map<uint32, CriteriaTree*> _criteriaTrees;
406 std::unordered_map<uint32, Criteria*> _criteria;
407 std::unordered_map<uint32, ModifierTreeNode*> _criteriaModifiers;
408
409 std::unordered_map<uint32, CriteriaTreeList> _criteriaTreeByCriteria;
410
411 // store criterias by type to speed up lookup
413 CriteriaList _criteriasByType[size_t(CriteriaType::Count)];
414 CriteriaListByAsset _criteriasByAsset[size_t(CriteriaType::Count)];
415 CriteriaList _guildCriteriasByType[size_t(CriteriaType::Count)];
416 CriteriaListByAsset _scenarioCriteriasByTypeAndScenarioId[size_t(CriteriaType::Count)];
417 CriteriaList _questObjectiveCriteriasByType[size_t(CriteriaType::Count)];
418
419 std::unordered_map<int32, CriteriaList> _criteriasByStartEvent[size_t(CriteriaStartEvent::Count)];
420 std::unordered_map<int32, CriteriaList> _criteriasByFailEvent[size_t(CriteriaFailEvent::Count)];
421};
422
423#define sCriteriaMgr CriteriaMgr::Instance()
424
425#endif // CriteriaHandler_h__
CriteriaFlagsCu
@ CRITERIA_FLAG_CU_ACCOUNT
@ CRITERIA_FLAG_CU_PLAYER
@ CRITERIA_FLAG_CU_QUEST_OBJECTIVE
@ CRITERIA_FLAG_CU_SCENARIO
@ CRITERIA_FLAG_CU_GUILD
ProgressType
@ PROGRESS_SET
@ PROGRESS_ACCUMULATE
@ PROGRESS_HIGHEST
std::unordered_map< uint32, CriteriaProgress > CriteriaProgressMap
std::unordered_map< uint32, CriteriaList > CriteriaListByAsset
std::vector< Criteria const * > CriteriaList
std::vector< CriteriaTree const * > CriteriaTreeList
CriteriaDataType
@ CRITERIA_DATA_TYPE_INSTANCE_SCRIPT
@ CRITERIA_DATA_TYPE_T_LEVEL
@ CRITERIA_DATA_TYPE_VALUE
@ CRITERIA_DATA_TYPE_T_CREATURE
@ CRITERIA_DATA_TYPE_SCRIPT
@ CRITERIA_DATA_TYPE_NTH_BIRTHDAY
@ CRITERIA_DATA_TYPE_MAP_DIFFICULTY
@ CRITERIA_DATA_TYPE_S_AURA
@ CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE
@ CRITERIA_DATA_TYPE_GAME_EVENT
@ CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH
@ CRITERIA_DATA_TYPE_MAP_ID
@ CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM
@ CRITERIA_DATA_TYPE_S_DRUNK
@ CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE
@ CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT
@ CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE
@ CRITERIA_DATA_TYPE_T_TEAM
@ CRITERIA_DATA_TYPE_HOLIDAY
@ CRITERIA_DATA_TYPE_T_GENDER
@ CRITERIA_DATA_TYPE_T_AURA
@ CRITERIA_DATA_TYPE_S_ITEM_QUALITY
@ CRITERIA_DATA_TYPE_NONE
@ CRITERIA_DATA_TYPE_S_KNOWN_TITLE
@ MAX_CRITERIA_DATA_TYPE
CriteriaStartEvent
Definition: DBCEnums.h:504
CriteriaFailEvent
Definition: DBCEnums.h:483
CriteriaType
Definition: DBCEnums.h:537
#define TC_GAME_API
Definition: Define.h:123
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:24
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:28
Achievement
virtual CriteriaList const & GetCriteriaByType(CriteriaType type, uint32 asset) const =0
virtual void AfterCriteriaTreeUpdate(CriteriaTree const *, Player *)
virtual void SendCriteriaProgressRemoved(uint32 criteriaId)=0
CriteriaHandler & operator=(CriteriaHandler const &right)=delete
virtual bool RequiredAchievementSatisfied(uint32) const
std::unordered_map< uint32, Milliseconds > _startedCriteria
CriteriaHandler & operator=(CriteriaHandler &&right)=delete
virtual void SendAllData(Player const *receiver) const =0
CriteriaHandler(CriteriaHandler &&right)=delete
CriteriaHandler(CriteriaHandler const &right)=delete
virtual void SendPacket(WorldPacket const *data) const =0
CriteriaProgressMap _criteriaProgress
virtual void CompletedCriteriaTree(CriteriaTree const *tree, Player *referencePlayer)=0
virtual std::string GetOwnerInfo() const =0
virtual void SendCriteriaUpdate(Criteria const *criteria, CriteriaProgress const *progress, Seconds timeElapsed, bool timedCompleted) const =0
std::unordered_map< uint32, CriteriaTree * > _criteriaTrees
CriteriaList const & GetGuildCriteriaByType(CriteriaType type) const
std::unordered_map< uint32, Criteria * > _criteria
static bool IsGroupCriteriaType(CriteriaType type)
CriteriaMgr & operator=(CriteriaMgr const &right)=delete
static void WalkCriteriaTree(CriteriaTree const *tree, Func const &func)
std::unordered_map< uint32, CriteriaDataSet > _criteriaDataMap
CriteriaMgr(CriteriaMgr const &right)=delete
CriteriaMgr(CriteriaMgr &&right)=delete
std::unordered_map< uint32, CriteriaTreeList > _criteriaTreeByCriteria
static CriteriaList const EmptyCriteriaList
CriteriaMgr & operator=(CriteriaMgr &&right)=delete
CriteriaDataSet const * GetCriteriaDataSet(Criteria const *Criteria) const
CriteriaTreeList const * GetCriteriaTreesByCriteria(uint32 criteriaId) const
std::unordered_map< uint32, ModifierTreeNode * > _criteriaModifiers
CriteriaList const & GetQuestObjectiveCriteriaByType(CriteriaType type) const
bool Meets(Player const *source, WorldObject const *target, uint32 miscValue1=0, uint32 miscValue2=0) const
std::vector< CriteriaData > _storage
void SetCriteriaId(uint32 id)
void Add(CriteriaData const &data)
struct CriteriaData::@5::@9 Health
struct CriteriaData::@5::@8 ClassRace
struct CriteriaData::@5::@7 Creature
struct CriteriaData::@5::@22 GameEvent
CriteriaDataType DataType
struct CriteriaData::@5::@12 Level
struct CriteriaData::@5::@21 KnownTitle
struct CriteriaData::@5::@18 BattlegroundScore
struct CriteriaData::@5::@24 Raw
uint32 ComparisonType
CriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId)
struct CriteriaData::@5::@19 EquippedItem
struct CriteriaData::@5::@10 Aura
struct CriteriaData::@5::@23 ItemQuality
struct CriteriaData::@5::@20 Map
struct CriteriaData::@5::@16 Drunk
bool IsValid(Criteria const *criteria)
bool Meets(uint32 criteriaId, Player const *source, WorldObject const *target, uint32 miscValue1=0, uint32 miscValue2=0) const
struct CriteriaData::@5::@14 MapPlayers
struct CriteriaData::@5::@17 Holiday
std::time_t Date
ObjectGuid PlayerGUID
ScenarioStepEntry const * ScenarioStep
std::vector< CriteriaTree const * > Children
CriteriaTreeEntry const * Entry
CriteriaEntry const * Entry
uint32 FlagsCu
ModifierTreeNode const * Modifier
ModifierTreeEntry const * Entry
std::vector< ModifierTreeNode const * > Children