Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
ConditionMgr.h
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#ifndef SKYFIRE_CONDITIONMGR_H
7#define SKYFIRE_CONDITIONMGR_H
8
9#include "Define.h"
10#include "Errors.h"
11#include "Platform/Singleton.h"
12#include <list>
13#include <map>
14#include "SharedDefines.h"
15
16class Player;
17class Unit;
18class WorldObject;
19class LootTemplate;
20struct Condition;
21
23{ // value1 value2 value3
24 CONDITION_NONE = 0, // 0 0 0 always true
25 CONDITION_AURA = 1, // spell_id effindex use target? true if player (or target, if value3) has aura of spell_id with effect effindex
26 CONDITION_ITEM = 2, // item_id count bank true if has #count of item_ids (if 'bank' is set it searches in bank slots too)
27 CONDITION_ITEM_EQUIPPED = 3, // item_id 0 0 true if has item_id equipped
28 CONDITION_ZONEID = 4, // zone_id 0 0 true if in zone_id
29 CONDITION_REPUTATION_RANK = 5, // faction_id rankMask 0 true if has min_rank for faction_id
30 CONDITION_TEAM = 6, // player_team 0, 0 469 - Alliance, 67 - Horde)
31 CONDITION_SKILL = 7, // skill_id skill_value 0 true if has skill_value for skill_id
32 CONDITION_QUESTREWARDED = 8, // quest_id 0 0 true if quest_id was rewarded before
33 CONDITION_QUESTTAKEN = 9, // quest_id 0, 0 true while quest active
34 CONDITION_DRUNKENSTATE = 10, // DrunkenState 0, 0 true if player is drunk enough
35 CONDITION_WORLD_STATE = 11, // index value 0 true if world has the value for the index
36 CONDITION_ACTIVE_EVENT = 12, // event_id 0 0 true if event is active
37 CONDITION_INSTANCE_INFO = 13, // entry data type true if the instance info defined by type (enum InstanceInfo) equals data.
38 CONDITION_QUEST_NONE = 14, // quest_id 0 0 true if doesn't have quest saved
39 CONDITION_CLASS = 15, // class 0 0 true if player's class is equal to class
40 CONDITION_RACE = 16, // race 0 0 true if player's race is equal to race
41 CONDITION_ACHIEVEMENT = 17, // achievement_id 0 0 true if achievement is complete
42 CONDITION_TITLE = 18, // title id 0 0 true if player has title
43 CONDITION_SPAWNMASK = 19, // spawnMask 0 0 true if in spawnMask
44 CONDITION_GENDER = 20, // gender 0 0 true if player's gender is equal to gender
45 CONDITION_UNIT_STATE = 21, // unitState 0 0 true if unit has unitState
46 CONDITION_MAPID = 22, // map_id 0 0 true if in map_id
47 CONDITION_AREAID = 23, // area_id 0 0 true if in area_id
48 CONDITION_CREATURE_TYPE = 24, // cinfo.type 0 0 true if creature_template.type = value1
49 CONDITION_SPELL = 25, // spell_id 0 0 true if player has learned spell
50 CONDITION_PHASEID = 26, // phaseid 0 0 true if object is in phaseid
51 CONDITION_LEVEL = 27, // level ComparisonType 0 true if unit's level is equal to param1 (param2 can modify the statement)
52 CONDITION_QUEST_COMPLETE = 28, // quest_id 0 0 true if player has quest_id with all objectives complete, but not yet rewarded
53 CONDITION_NEAR_CREATURE = 29, // creature entry distance 0 true if there is a creature of entry in range
54 CONDITION_NEAR_GAMEOBJECT = 30, // gameobject entry distance 0 true if there is a gameobject of entry in range
55 CONDITION_OBJECT_ENTRY = 31, // TypeID entry 0 true if object is type TypeID and the entry is 0 or matches entry of the object
56 CONDITION_TYPE_MASK = 32, // TypeMask 0 0 true if object is type object's TypeMask matches provided TypeMask
57 CONDITION_RELATION_TO = 33, // ConditionTarget RelationType 0 true if object is in given relation with object specified by ConditionTarget
58 CONDITION_REACTION_TO = 34, // ConditionTarget rankMask 0 true if object's reaction matches rankMask object specified by ConditionTarget
59 CONDITION_DISTANCE_TO = 35, // ConditionTarget distance ComparisonType true if object and ConditionTarget are within distance given by parameters
60 CONDITION_ALIVE = 36, // 0 0 0 true if unit is alive
61 CONDITION_HP_VAL = 37, // hpVal ComparisonType 0 true if unit's hp matches given value
62 CONDITION_HP_PCT = 38, // hpPct ComparisonType 0 true if unit's hp matches given pct
63 CONDITION_TERRAIN_SWAP = 39, // terrainSwap 0 0 true if object is in terrainswap
64 CONDITION_MAX = 40 // MAX
65};
66
125
136
143
148
150{
151 WorldObject* mConditionTargets[MAX_CONDITION_TARGETS]; // an array of targets available for conditions
153 ConditionSourceInfo(WorldObject* target0, WorldObject* target1 = NULL, WorldObject* target2 = NULL)
154 {
155 mConditionTargets[0] = target0;
156 mConditionTargets[1] = target1;
157 mConditionTargets[2] = target2;
159 }
160};
161
204
205typedef std::list<Condition*> ConditionList;
206typedef std::map<uint32, ConditionList> ConditionTypeContainer;
207typedef std::map<ConditionSourceType, ConditionTypeContainer> ConditionContainer;
208typedef std::map<uint32, ConditionTypeContainer> CreatureSpellConditionContainer;
209typedef std::map<uint32, ConditionTypeContainer> NpcVendorConditionContainer;
210typedef std::map<std::pair<int32, uint32 /*SAI source_type*/>, ConditionTypeContainer> SmartEventConditionContainer;
211
212typedef std::map<uint32, ConditionList> ConditionReferenceContainer;//only used for references
213
215{
216 friend class Skyfire::Singleton<ConditionMgr, Skyfire::NullMutex>;
217
218 private:
219 ConditionMgr();
220 ~ConditionMgr();
221
222 public:
223 void LoadConditions(bool isReload = false);
224 bool isConditionTypeValid(Condition* cond);
226
227 uint32 GetSearcherTypeMaskForConditionList(ConditionList const& conditions);
228 bool IsObjectMeetToConditions(WorldObject* object, ConditionList const& conditions);
229 bool IsObjectMeetToConditions(WorldObject* object1, WorldObject* object2, ConditionList const& conditions);
230 bool IsObjectMeetToConditions(ConditionSourceInfo& sourceInfo, ConditionList const& conditions);
231 bool CanHaveSourceGroupSet(ConditionSourceType sourceType) const;
232 bool CanHaveSourceIdSet(ConditionSourceType sourceType) const;
233 ConditionList GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry);
234 ConditionList GetConditionsForSpellClickEvent(uint32 creatureId, uint32 spellId);
235 ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType);
236 ConditionList GetConditionsForVehicleSpell(uint32 creatureId, uint32 spellId);
237 ConditionList GetConditionsForNpcVendorEvent(uint32 creatureId, uint32 itemId);
238
239 private:
240 bool isSourceTypeValid(Condition* cond);
241 bool addToLootTemplate(Condition* cond, LootTemplate* loot);
242 bool addToGossipMenus(Condition* cond);
243 bool addToGossipMenuItems(Condition* cond);
244 bool addToSpellImplicitTargetConditions(Condition* cond);
245 bool addToTerrainSwaps(Condition* cond);
246 bool addToPhases(Condition* cond);
247 bool IsObjectMeetToConditionList(ConditionSourceInfo& sourceInfo, ConditionList const& conditions);
248
249 void Clean(); // free up resources
250 std::list<Condition*> AllocatedMemoryStore; // some garbage collection :)
251
258};
259
260#define sConditionMgr Skyfire::Singleton<ConditionMgr, Skyfire::NullMutex>::instance()
261
262#endif
std::map< uint32, ConditionTypeContainer > NpcVendorConditionContainer
std::map< uint32, ConditionTypeContainer > CreatureSpellConditionContainer
std::map< uint32, ConditionList > ConditionReferenceContainer
ConditionSourceType
@ CONDITION_SOURCE_TYPE_MAX
@ CONDITION_SOURCE_TYPE_VEHICLE_SPELL
@ CONDITION_SOURCE_TYPE_DISENCHANT_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_QUEST_ACCEPT
@ CONDITION_SOURCE_TYPE_REFERENCE_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_TERRAIN_SWAP
@ CONDITION_SOURCE_TYPE_NPC_VENDOR
@ CONDITION_SOURCE_TYPE_GOSSIP_MENU_OPTION
@ CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT
@ CONDITION_SOURCE_TYPE_MAIL_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_QUEST_SHOW_MARK
@ CONDITION_SOURCE_TYPE_PHASE
@ CONDITION_SOURCE_TYPE_SPELL_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SMART_EVENT
@ CONDITION_SOURCE_TYPE_PICKPOCKETING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_PROSPECTING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SPELL
@ CONDITION_SOURCE_TYPE_FISHING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_GOSSIP_MENU
@ CONDITION_SOURCE_TYPE_CREATURE_TEMPLATE_VEHICLE
@ CONDITION_SOURCE_TYPE_ITEM_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SPELL_IMPLICIT_TARGET
@ CONDITION_SOURCE_TYPE_SKINNING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_CREATURE_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_GAMEOBJECT_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_MILLING_LOOT_TEMPLATE
@ CONDITION_SOURCE_TYPE_SPELL_PROC
@ CONDITION_SOURCE_TYPE_NONE
InstanceInfo
@ INSTANCE_INFO_DATA64
@ INSTANCE_INFO_DATA
@ INSTANCE_INFO_BOSS_STATE
MaxConditionTargets
@ MAX_CONDITION_TARGETS
ConditionTypes
@ CONDITION_OBJECT_ENTRY
@ CONDITION_MAPID
@ CONDITION_SKILL
@ CONDITION_RACE
@ CONDITION_PHASEID
@ CONDITION_REACTION_TO
@ CONDITION_NEAR_GAMEOBJECT
@ CONDITION_QUESTREWARDED
@ CONDITION_ACTIVE_EVENT
@ CONDITION_INSTANCE_INFO
@ CONDITION_RELATION_TO
@ CONDITION_DRUNKENSTATE
@ CONDITION_AURA
@ CONDITION_ACHIEVEMENT
@ CONDITION_DISTANCE_TO
@ CONDITION_HP_VAL
@ CONDITION_GENDER
@ CONDITION_TERRAIN_SWAP
@ CONDITION_REPUTATION_RANK
@ CONDITION_HP_PCT
@ CONDITION_QUEST_COMPLETE
@ CONDITION_MAX
@ CONDITION_SPELL
@ CONDITION_ZONEID
@ CONDITION_TYPE_MASK
@ CONDITION_AREAID
@ CONDITION_ITEM
@ CONDITION_WORLD_STATE
@ CONDITION_SPAWNMASK
@ CONDITION_CLASS
@ CONDITION_TEAM
@ CONDITION_NONE
@ CONDITION_QUEST_NONE
@ CONDITION_ITEM_EQUIPPED
@ CONDITION_LEVEL
@ CONDITION_QUESTTAKEN
@ CONDITION_NEAR_CREATURE
@ CONDITION_TITLE
@ CONDITION_ALIVE
@ CONDITION_CREATURE_TYPE
@ CONDITION_UNIT_STATE
std::map< std::pair< int32, uint32 >, ConditionTypeContainer > SmartEventConditionContainer
std::map< ConditionSourceType, ConditionTypeContainer > ConditionContainer
std::list< Condition * > ConditionList
std::map< uint32, ConditionList > ConditionTypeContainer
RelationType
@ RELATION_IN_PARTY
@ RELATION_IN_RAID_OR_PARTY
@ RELATION_CREATED_BY
@ RELATION_MAX
@ RELATION_SELF
@ RELATION_PASSENGER_OF
@ RELATION_OWNED_BY
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
SpellCastResult
uint32 GetSearcherTypeMaskForConditionList(ConditionList const &conditions)
bool IsObjectMeetToConditionList(ConditionSourceInfo &sourceInfo, ConditionList const &conditions)
bool isConditionTypeValid(Condition *cond)
bool CanHaveSourceGroupSet(ConditionSourceType sourceType) const
bool addToSpellImplicitTargetConditions(Condition *cond)
bool addToGossipMenus(Condition *cond)
SmartEventConditionContainer SmartEventConditionStore
bool addToGossipMenuItems(Condition *cond)
ConditionList GetConditionsForNotGroupedEntry(ConditionSourceType sourceType, uint32 entry)
bool addToLootTemplate(Condition *cond, LootTemplate *loot)
CreatureSpellConditionContainer SpellClickEventConditionStore
ConditionList GetConditionsForNpcVendorEvent(uint32 creatureId, uint32 itemId)
CreatureSpellConditionContainer VehicleSpellConditionStore
ConditionList GetConditionsForSpellClickEvent(uint32 creatureId, uint32 spellId)
bool isSourceTypeValid(Condition *cond)
bool addToPhases(Condition *cond)
bool addToTerrainSwaps(Condition *cond)
NpcVendorConditionContainer NpcVendorConditionContainerStore
bool CanHaveSourceIdSet(ConditionSourceType sourceType) const
ConditionContainer ConditionStore
ConditionList GetConditionsForSmartEvent(int32 entryOrGuid, uint32 eventId, uint32 sourceType)
ConditionReferenceContainer ConditionReferenceStore
std::list< Condition * > AllocatedMemoryStore
ConditionList GetConditionReferences(uint32 refId)
bool IsObjectMeetToConditions(WorldObject *object, ConditionList const &conditions)
ConditionList GetConditionsForVehicleSpell(uint32 creatureId, uint32 spellId)
void LoadConditions(bool isReload=false)
Definition Unit.h:1367
uint32 GetSearcherTypeMaskForCondition()
uint32 SourceGroup
ConditionTypes ConditionType
bool isLoaded() const
bool Meets(ConditionSourceInfo &sourceInfo)
uint32 SourceId
int32 SourceEntry
uint32 ElseGroup
uint32 ScriptId
bool NegativeCondition
ConditionSourceType SourceType
SpellCastResult ErrorType
uint32 ConditionValue2
uint8 ConditionTarget
uint32 ReferenceId
uint32 ErrorTextId
uint32 ConditionValue3
uint32 ConditionValue1
uint32 GetMaxAvailableConditionTargets()
Condition * mLastFailedCondition
WorldObject * mConditionTargets[MAX_CONDITION_TARGETS]
ConditionSourceInfo(WorldObject *target0, WorldObject *target1=NULL, WorldObject *target2=NULL)