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 <unordered_map>
26#include <vector>
27#include <ctime>
28
29class Player;
30class WorldObject;
31class WorldPacket;
32struct AchievementEntry;
33struct CriteriaEntry;
36struct QuestObjective;
38
40{
42 std::vector<ModifierTreeNode const*> Children;
43};
44
46{
52};
53
55{
57 CriteriaEntry const* Entry = nullptr;
58 ModifierTreeNode const* Modifier = nullptr;
60};
61
62typedef std::vector<Criteria const*> CriteriaList;
63typedef std::unordered_map<uint32, CriteriaList> CriteriaListByAsset;
64
66{
68 CriteriaTreeEntry const* Entry = nullptr;
69 AchievementEntry const* Achievement = nullptr;
72 ::Criteria const* Criteria = nullptr;
73 std::vector<CriteriaTree const*> Children;
74};
75
76typedef std::vector<CriteriaTree const*> CriteriaTreeList;
77
79{
81 std::time_t Date = std::time_t(0); // latest update time.
82 ObjectGuid PlayerGUID; // GUID of the player that last updated the criteria
83 bool Changed = false;
84};
85
87{ // value1 value2 comment
89 CRITERIA_DATA_TYPE_T_CREATURE = 1, // CreatureId 0
92 CRITERIA_DATA_TYPE_S_AURA = 5, // SpellId EffectIndex
93 CRITERIA_DATA_TYPE_T_AURA = 7, // SpellId EffectIndex
94 CRITERIA_DATA_TYPE_VALUE = 8, // Minvalue value provided with update must be not less that limit
95 CRITERIA_DATA_TYPE_T_LEVEL = 9, // Minlevel minlevel of target
96 CRITERIA_DATA_TYPE_T_GENDER = 10, // Gender 0=male; 1=female
97 CRITERIA_DATA_TYPE_SCRIPT = 11, // Scripted requirement
98 CRITERIA_DATA_TYPE_MAP_DIFFICULTY = 12, // used on 3.3.5a branch
99 CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // Count "with less than %u people in the zone"
100 CRITERIA_DATA_TYPE_T_TEAM = 14, // Team HORDE(67), ALLIANCE(469)
101 CRITERIA_DATA_TYPE_S_DRUNK = 15, // DrunkenState 0 (enum DrunkenState) of player
102 CRITERIA_DATA_TYPE_HOLIDAY = 16, // HolidayId 0 event in holiday time
103 CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // MinScore MaxScore player's team win bg and opposition team have team score in range
104 CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
105 CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19, // ItemLevel Quality for equipped item in slot to check item level and quality
106 CRITERIA_DATA_TYPE_MAP_ID = 20, // MapId 0 player must be on map with id in map_id
108 CRITERIA_DATA_TYPE_NTH_BIRTHDAY = 22, // used on 3.3.5a branch
109 CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // TitleId known (pvp) title, values from dbc
110 CRITERIA_DATA_TYPE_GAME_EVENT = 24, // GameEventId 0
112
115
117{
119 union
120 {
121 // CRITERIA_DATA_TYPE_NONE = 0 (no data)
122 // CRITERIA_DATA_TYPE_T_CREATURE = 1
123 struct
124 {
127 // CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
128 // CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
129 struct
130 {
134 // CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3
135 struct
136 {
139 // CRITERIA_DATA_TYPE_S_AURA = 5
140 // CRITERIA_DATA_TYPE_T_AURA = 7
141 struct
142 {
146 // CRITERIA_DATA_TYPE_VALUE = 8
147 struct
148 {
152 // CRITERIA_DATA_TYPE_T_LEVEL = 9
153 struct
154 {
157 // CRITERIA_DATA_TYPE_T_GENDER = 10
158 struct
159 {
162 // CRITERIA_DATA_TYPE_SCRIPT = 11 (no data)
163 // CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13
164 struct
165 {
168 // CRITERIA_DATA_TYPE_T_TEAM = 14
169 struct
170 {
173 // CRITERIA_DATA_TYPE_S_DRUNK = 15
174 struct
175 {
178 // CRITERIA_DATA_TYPE_HOLIDAY = 16
179 struct
180 {
181 uint32 Id;
183 // CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
184 struct
185 {
186 uint32 Min;
189 // CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data)
190 // CRITERIA_DATA_TYPE_S_EQUIPPED_ITEM = 19
191 struct
192 {
196 // CRITERIA_DATA_TYPE_MAP_ID = 20
197 struct
198 {
199 uint32 Id;
201 // CRITERIA_DATA_TYPE_KNOWN_TITLE = 23
202 struct
203 {
204 uint32 Id;
206 // CRITERIA_DATA_TYPE_GAME_EVENT = 25
207 struct
208 {
209 uint32 Id;
211 // CRITERIA_DATA_TYPE_S_ITEM_QUALITY = 24
212 struct
213 {
216 // raw
217 struct
218 {
222 };
224
226 {
227 Raw.Value1 = 0;
228 Raw.Value2 = 0;
229 ScriptId = 0;
230 }
231
232 CriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId) : DataType(CriteriaDataType(_dataType))
233 {
234 Raw.Value1 = _value1;
235 Raw.Value2 = _value2;
236 ScriptId = _scriptId;
237 }
238
239 bool IsValid(Criteria const* criteria);
240 bool Meets(uint32 criteriaId, Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
241};
242
244{
246 void Add(CriteriaData const& data) { _storage.push_back(data); }
247 bool Meets(Player const* source, WorldObject const* target, uint32 miscValue1 = 0, uint32 miscValue2 = 0) const;
249private:
251 std::vector<CriteriaData> _storage;
252};
253
254typedef std::unordered_map<uint32, CriteriaProgress> CriteriaProgressMap;
255
257{
262
264{
265public:
267 virtual ~CriteriaHandler();
268
269 CriteriaHandler(CriteriaHandler const& right) = delete;
273
274 virtual void Reset();
275
276 void UpdateCriteria(CriteriaType type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, WorldObject const* ref = nullptr, Player* referencePlayer = nullptr);
277
278 virtual void SendAllData(Player const* receiver) const = 0;
279
280 void UpdateTimedCriteria(Milliseconds timeDiff);
281 void StartCriteria(CriteriaStartEvent startEvent, uint32 entry, Milliseconds timeLost = Milliseconds::zero());
282 virtual void FailCriteria(CriteriaFailEvent failEvent, uint32 asset);
283
284protected:
285 virtual void SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, Seconds timeElapsed, bool timedCompleted) const = 0;
286
287 CriteriaProgress* GetCriteriaProgress(Criteria const* entry);
288 void SetCriteriaProgress(Criteria const* criteria, uint64 changeValue, Player* referencePlayer, ProgressType progressType = PROGRESS_SET);
289 void RemoveCriteriaProgress(Criteria const* criteria);
290 virtual void SendCriteriaProgressRemoved(uint32 criteriaId) = 0;
291
292 bool IsCompletedCriteriaTree(CriteriaTree const* tree);
293 virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const;
294 virtual bool CanCompleteCriteriaTree(CriteriaTree const* tree);
295 virtual void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) = 0;
296 virtual void AfterCriteriaTreeUpdate(CriteriaTree const* /*tree*/, Player* /*referencePlayer*/) { }
297
298 bool IsCompletedCriteria(Criteria const* criteria, uint64 requiredAmount);
299 bool CanUpdateCriteria(Criteria const* criteria, CriteriaTreeList const* trees, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, WorldObject const* ref, Player* referencePlayer);
300
301 virtual void SendPacket(WorldPacket const* data) const = 0;
302
303 bool ConditionsSatisfied(Criteria const* criteria, Player* referencePlayer) const;
304 bool RequirementsSatisfied(Criteria const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, WorldObject const* ref, Player* referencePlayer) const;
305 virtual bool RequiredAchievementSatisfied(uint32 /*achievementId*/) const { return false; }
306 bool ModifierTreeSatisfied(ModifierTreeNode const* parent, uint64 miscValue1, uint64 miscValue2, WorldObject const* ref, Player* referencePlayer) const;
307 bool ModifierSatisfied(ModifierTreeEntry const* modifier, uint64 miscValue1, uint64 miscValue2, WorldObject const* ref, Player* referencePlayer) const;
308
309 virtual std::string GetOwnerInfo() const = 0;
310 virtual CriteriaList const& GetCriteriaByType(CriteriaType type, uint32 asset) const = 0;
311
313 std::unordered_map<uint32 /*criteriaID*/, Milliseconds /*time left*/> _startedCriteria;
314};
315
317{
319 ~CriteriaMgr();
320
321public:
322 CriteriaMgr(CriteriaMgr const& right) = delete;
323 CriteriaMgr(CriteriaMgr&& right) = delete;
324 CriteriaMgr& operator=(CriteriaMgr const& right) = delete;
326
327 static char const* GetCriteriaTypeString(CriteriaType type);
328 static char const* GetCriteriaTypeString(uint32 type);
329
330 static CriteriaMgr* Instance();
331
332 CriteriaList const& GetPlayerCriteriaByType(CriteriaType type, uint32 asset) const;
333
335 {
336 return _guildCriteriasByType[size_t(type)];
337 }
338
339 CriteriaList const& GetScenarioCriteriaByTypeAndScenario(CriteriaType type, uint32 scenarioId) const;
340
342 {
343 return _questObjectiveCriteriasByType[size_t(type)];
344 }
345
347 {
348 auto itr = _criteriaTreeByCriteria.find(criteriaId);
349 return itr != _criteriaTreeByCriteria.end() ? &itr->second : nullptr;
350 }
351
352 std::unordered_map<int32, CriteriaList> const& GetCriteriaByStartEvent(CriteriaStartEvent startEvent) const;
353 CriteriaList const* GetCriteriaByStartEvent(CriteriaStartEvent startEvent, int32 asset) const;
354
355 std::unordered_map<int32, CriteriaList> const& GetCriteriaByFailEvent(CriteriaFailEvent failEvent) const;
356 CriteriaList const* GetCriteriaByFailEvent(CriteriaFailEvent failEvent, int32 asset) const;
357
359 {
360 auto iter = _criteriaDataMap.find(Criteria->ID);
361 return iter != _criteriaDataMap.end() ? &iter->second : nullptr;
362 }
363
365 {
366 switch (type)
367 {
370 case CriteriaType::BeSpellTarget: // NYI
372 case CriteriaType::GainAura: // NYI
374 return true;
375 default:
376 break;
377 }
378
379 return false;
380 }
381
382 template<typename Func>
383 static void WalkCriteriaTree(CriteriaTree const* tree, Func const& func)
384 {
385 for (CriteriaTree const* node : tree->Children)
386 WalkCriteriaTree(node, func);
387
388 func(tree);
389 }
390
391 void LoadCriteriaModifiersTree();
392 void LoadCriteriaList();
393 void LoadCriteriaData();
394 CriteriaTree const* GetCriteriaTree(uint32 criteriaTreeId) const;
395 Criteria const* GetCriteria(uint32 criteriaId) const;
396 ModifierTreeNode const* GetModifierTree(uint32 modifierTreeId) const;
397
398private:
399 std::unordered_map<uint32, CriteriaDataSet> _criteriaDataMap;
400
401 std::unordered_map<uint32, CriteriaTree*> _criteriaTrees;
402 std::unordered_map<uint32, Criteria*> _criteria;
403 std::unordered_map<uint32, ModifierTreeNode*> _criteriaModifiers;
404
405 std::unordered_map<uint32, CriteriaTreeList> _criteriaTreeByCriteria;
406
407 // store criterias by type to speed up lookup
409 CriteriaList _criteriasByType[size_t(CriteriaType::Count)];
410 CriteriaListByAsset _criteriasByAsset[size_t(CriteriaType::Count)];
411 CriteriaList _guildCriteriasByType[size_t(CriteriaType::Count)];
412 CriteriaListByAsset _scenarioCriteriasByTypeAndScenarioId[size_t(CriteriaType::Count)];
413 CriteriaList _questObjectiveCriteriasByType[size_t(CriteriaType::Count)];
414
415 std::unordered_map<int32, CriteriaList> _criteriasByStartEvent[size_t(CriteriaStartEvent::Count)];
416 std::unordered_map<int32, CriteriaList> _criteriasByFailEvent[size_t(CriteriaFailEvent::Count)];
417};
418
419#define sCriteriaMgr CriteriaMgr::Instance()
420
421#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:470
CriteriaFailEvent
Definition: DBCEnums.h:449
CriteriaType
Definition: DBCEnums.h:503
#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::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
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::@9::@14 Aura
struct CriteriaData::@9::@23 EquippedItem
struct CriteriaData::@9::@27 ItemQuality
CriteriaDataType DataType
struct CriteriaData::@9::@12 ClassRace
struct CriteriaData::@9::@21 Holiday
struct CriteriaData::@9::@16 Level
uint32 ComparisonType
struct CriteriaData::@9::@24 Map
struct CriteriaData::@9::@26 GameEvent
struct CriteriaData::@9::@11 Creature
CriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId)
struct CriteriaData::@9::@22 BattlegroundScore
struct CriteriaData::@9::@28 Raw
struct CriteriaData::@9::@18 MapPlayers
struct CriteriaData::@9::@13 Health
bool IsValid(Criteria const *criteria)
bool Meets(uint32 criteriaId, Player const *source, WorldObject const *target, uint32 miscValue1=0, uint32 miscValue2=0) const
struct CriteriaData::@9::@20 Drunk
struct CriteriaData::@9::@25 KnownTitle
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