TrinityCore
SpellAuras.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 TRINITY_SPELLAURAS_H
19#define TRINITY_SPELLAURAS_H
20
21#include "DBStorageIterator.h"
22#include "IteratorPair.h"
23#include "SpellAuraDefines.h"
24#include "SpellInfo.h"
25#include "UniqueTrackablePtr.h"
26#include <typeinfo>
27
28class SpellInfo;
29struct SpellModifier;
30struct ProcTriggerSpell;
31struct SpellProcEntry;
32
33namespace WorldPackets
34{
35 namespace Spells
36 {
37 struct AuraInfo;
38 }
39}
40
41// forward decl
42class Aura;
43class AuraEffect;
44class AuraScript;
45class DamageInfo;
46class DispelInfo;
47class DynObjAura;
48class ChargeDropEvent;
49class DynamicObject;
50class HealInfo;
51class ProcEventInfo;
52class Unit;
53class UnitAura;
54
55// update aura target map every 500 ms instead of every update - reduce amount of grid searcher calls
56#define UPDATE_TARGET_MAP_INTERVAL 500
57
59{
60 friend class Unit;
61
62 private:
63 Unit* const _target;
64 Aura* const _base;
65 AuraRemoveMode _removeMode:8; // Store info for know remove aura reason
66 uint16 _slot; // Aura slot on unit
67 uint16 _flags; // Aura info flag
68 uint32 _effectsToApply; // Used only at spell hit to determine which effect should be applied
71
72 explicit AuraApplication(Unit* target, Unit* caster, Aura* base, uint32 effMask);
73 void _Remove();
74
75 void _InitFlags(Unit* caster, uint32 effMask);
76 void _HandleEffect(uint8 effIndex, bool apply);
77
78 public:
79 Unit* GetTarget() const { return _target; }
80 Aura* GetBase() const { return _base; }
81
82 uint16 GetSlot() const { return _slot; }
83 uint16 GetFlags() const { return _flags; }
84 uint32 GetEffectMask() const { return _effectMask; }
85 bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_effectMask & (1 << effect)) != 0; }
86 bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; }
87 bool IsSelfcast() const { return (_flags & AFLAG_NOCASTER) != 0; }
88
89 uint32 GetEffectsToApply() const { return _effectsToApply; }
90 void UpdateApplyEffectMask(uint32 newEffMask, bool canHandleNewEffects);
91 void AddEffectToApplyEffectMask(SpellEffIndex spellEffectIndex);
92
93 void SetRemoveMode(AuraRemoveMode mode) { _removeMode = mode; }
94 AuraRemoveMode GetRemoveMode() const { return _removeMode; }
95
96 void SetNeedClientUpdate();
97 bool IsNeedClientUpdate() const { return _needClientUpdate; }
98 void BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo, bool remove);
99 void ClientUpdate(bool remove = false);
100
101 std::string GetDebugInfo() const;
102};
103
104// Structure representing database aura primary key fields
106{
111
112 friend std::strong_ordering operator<=>(AuraKey const& left, AuraKey const& right) = default;
113};
114
116{
117 std::array<int32, MAX_SPELL_EFFECTS> Amounts;
118 std::array<int32, MAX_SPELL_EFFECTS> BaseAmounts;
119};
120
122{
123 friend class Unit;
124
125 public:
126 typedef std::unordered_map<ObjectGuid, AuraApplication*> ApplicationMap;
127
128 static uint32 BuildEffectMaskForOwner(SpellInfo const* spellProto, uint32 availableEffectMask, WorldObject* owner);
129 static Aura* TryRefreshStackOrCreate(AuraCreateInfo& createInfo, bool updateEffectMask = true);
130 static Aura* TryCreate(AuraCreateInfo& createInfo);
131 static Aura* Create(AuraCreateInfo& createInfo);
132 explicit Aura(AuraCreateInfo const& createInfo);
133 void _InitEffects(uint32 effMask, Unit* caster, int32 const* baseAmount);
134 void SaveCasterInfo(Unit* caster);
135 virtual ~Aura();
136
137 SpellInfo const* GetSpellInfo() const { return m_spellInfo; }
138 uint32 GetId() const{ return GetSpellInfo()->Id; }
139 Difficulty GetCastDifficulty() const { return m_castDifficulty; }
140
141 ObjectGuid GetCastId() const { return m_castId; }
142 ObjectGuid GetCasterGUID() const { return m_casterGuid; }
143 ObjectGuid GetCastItemGUID() const { return m_castItemGuid; }
144 uint32 GetCastItemId() const { return m_castItemId; }
145 int32 GetCastItemLevel() const { return m_castItemLevel; }
146 SpellCastVisual GetSpellVisual() const { return m_spellVisual; }
147 Unit* GetCaster() const;
148 WorldObject* GetWorldObjectCaster() const;
149 WorldObject* GetOwner() const { return m_owner; }
150 Unit* GetUnitOwner() const { ASSERT(GetType() == UNIT_AURA_TYPE); return m_owner->ToUnit(); }
151 DynamicObject* GetDynobjOwner() const { ASSERT(GetType() == DYNOBJ_AURA_TYPE); return m_owner->ToDynObject(); }
152
153 AuraObjectType GetType() const;
154
155 virtual void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication * auraApp);
156 virtual void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * auraApp);
157 void _Remove(AuraRemoveMode removeMode);
158 virtual void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) = 0;
159
160 virtual void FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* caster) = 0;
161 void UpdateTargetMap(Unit* caster, bool apply = true);
162
163 void _RegisterForTargets() { Unit* caster = GetCaster(); UpdateTargetMap(caster, false); }
164 void ApplyForTargets() { Unit* caster = GetCaster(); UpdateTargetMap(caster, true); }
165 void _ApplyEffectForTargets(uint8 effIndex);
166
167 void UpdateOwner(uint32 diff, WorldObject* owner);
168 void Update(uint32 diff, Unit* caster);
169
170 time_t GetApplyTime() const { return m_applyTime; }
171 int32 GetMaxDuration() const { return m_maxDuration; }
172 void SetMaxDuration(int32 duration) { m_maxDuration = duration; }
173 int32 CalcMaxDuration() const { return CalcMaxDuration(GetCaster()); }
174 int32 CalcMaxDuration(Unit* caster) const;
175 static int32 CalcMaxDuration(SpellInfo const* spellInfo, WorldObject const* caster, std::vector<SpellPowerCost> const* powerCosts);
176 int32 GetDuration() const { return m_duration; }
177 void SetDuration(int32 duration, bool withMods = false);
178 void RefreshDuration(bool withMods = false);
179 void RefreshTimers(bool resetPeriodicTimer);
180 bool IsExpired() const { return !GetDuration() && !m_dropEvent; }
181 bool IsPermanent() const { return GetMaxDuration() == -1; }
182
183 uint8 GetCharges() const { return m_procCharges; }
184 void SetCharges(uint8 charges);
185 uint8 CalcMaxCharges(Unit* caster) const;
186 uint8 CalcMaxCharges() const { return CalcMaxCharges(GetCaster()); }
187 bool ModCharges(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
188 bool DropCharge(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) { return ModCharges(-1, removeMode); }
189 void ModChargesDelayed(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
190 void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
191
192 uint8 GetStackAmount() const { return m_stackAmount; }
193 void SetStackAmount(uint8 num);
194 bool ModStackAmount(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT, bool resetPeriodicTimer = true);
195 uint32 CalcMaxStackAmount() const;
196 bool IsUsingStacks() const;
197
198 uint8 GetCasterLevel() const { return m_casterLevel; }
199
200 bool HasMoreThanOneEffectForType(AuraType auraType) const;
201 bool IsArea() const;
202 bool IsPassive() const;
203 bool IsDeathPersistent() const;
204
205 bool IsRemovedOnShapeLost(Unit* target) const;
206
207 bool CanBeSaved() const;
208 bool IsRemoved() const { return m_isRemoved; }
209 // Single cast aura helpers
210 bool IsSingleTarget() const {return m_isSingleTarget; }
211 bool IsSingleTargetWith(Aura const* aura) const;
212 void SetIsSingleTarget(bool val) { m_isSingleTarget = val; }
213 void UnregisterSingleTarget();
214 int32 CalcDispelChance(Unit const* auraTarget, bool offensive) const;
215
225 AuraKey GenerateKey(uint32& recalculateMask) const;
226 void SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint32 recalculateMask, int32* amount);
227
228 // helpers for aura effects
229 bool CanPeriodicTickCrit() const;
230
231 bool HasEffect(uint8 effIndex) const { return GetEffect(effIndex) != nullptr; }
232 bool HasEffectType(AuraType type) const;
233 static bool EffectTypeNeedsSendingAmount(AuraType type);
234 AuraEffect* GetEffect(uint32 index) const;
235 uint32 GetEffectMask() const;
236 void RecalculateAmountOfEffects();
237 void HandleAllEffects(AuraApplication * aurApp, uint8 mode, bool apply);
238
239 // Helpers for targets
240 ApplicationMap const& GetApplicationMap() { return m_applications; }
241 void GetApplicationVector(std::vector<AuraApplication*>& applications) const;
242 AuraApplication const* GetApplicationOfTarget(ObjectGuid guid) const;
243 AuraApplication* GetApplicationOfTarget(ObjectGuid guid);
244 bool IsAppliedOnTarget(ObjectGuid guid) const;
245
246 void SetNeedClientUpdateForTargets() const;
247 void HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, bool apply, bool onReapply);
248 bool CanBeAppliedOn(Unit* target);
249 bool CheckAreaTarget(Unit* target);
250 bool CanStackWith(Aura const* existingAura) const;
251
252 bool IsProcOnCooldown(TimePoint now) const;
253 void AddProcCooldown(SpellProcEntry const* procEntry, TimePoint now);
254 void ResetProcCooldown();
255 bool IsUsingCharges() const { return m_isUsingCharges; }
256 void SetUsingCharges(bool val) { m_isUsingCharges = val; }
257 void PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo, TimePoint now);
258 void PrepareProcChargeDrop(SpellProcEntry const* procEntry, ProcEventInfo const& eventInfo);
259 void ConsumeProcCharges(SpellProcEntry const* procEntry);
260 uint32 GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, TimePoint now) const;
261 float CalcProcChance(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const;
262 void TriggerProcOnEvent(uint32 procEffectMask, AuraApplication* aurApp, ProcEventInfo& eventInfo);
263 float CalcPPMProcChance(Unit* actor) const;
264 void SetLastProcAttemptTime(TimePoint lastProcAttemptTime) { m_lastProcAttemptTime = lastProcAttemptTime; }
265 void SetLastProcSuccessTime(TimePoint lastProcSuccessTime) { m_lastProcSuccessTime = lastProcSuccessTime; }
266 virtual void Heartbeat() { }
267
268 // AuraScript
269 void LoadScripts();
270 bool CallScriptCheckAreaTargetHandlers(Unit* target);
271 void CallScriptDispel(DispelInfo* dispelInfo);
272 void CallScriptAfterDispel(DispelInfo* dispelInfo);
273 void CallScriptOnHeartbeat();
274 bool CallScriptEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
275 bool CallScriptEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
276 void CallScriptAfterEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
277 void CallScriptAfterEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
278 bool CallScriptEffectPeriodicHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp);
279 void CallScriptEffectUpdatePeriodicHandlers(AuraEffect* aurEff);
280 void CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated);
281 void CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude);
282 void CallScriptEffectCalcSpellModHandlers(AuraEffect const* aurEff, SpellModifier*& spellMod);
283 void CallScriptEffectCalcCritChanceHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, Unit const* victim, float& critChance);
284 void CallScriptCalcDamageAndHealingHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod);
285 void CallScriptEffectAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount, bool & defaultPrevented);
286 void CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount);
287 void CallScriptEffectAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, HealInfo& healInfo, uint32& absorbAmount, bool& defaultPrevented);
288 void CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, HealInfo& healInfo, uint32& absorbAmount);
289 void CallScriptEffectManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount, bool & defaultPrevented);
290 void CallScriptEffectAfterManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount);
291 void CallScriptEffectSplitHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& splitAmount);
292 void CallScriptEnterLeaveCombatHandlers(AuraApplication const* aurApp, bool isNowInCombat);
293 // Spell Proc Hooks
294 bool CallScriptCheckProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
295 bool CallScriptCheckEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
296 bool CallScriptPrepareProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
297 bool CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
298 void CallScriptAfterProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
299 bool CallScriptEffectProcHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
300 void CallScriptAfterEffectProcHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
301
302 UnitAura* ToUnitAura() { if (GetType() == UNIT_AURA_TYPE) return reinterpret_cast<UnitAura*>(this); else return nullptr; }
303 UnitAura const* ToUnitAura() const { if (GetType() == UNIT_AURA_TYPE) return reinterpret_cast<UnitAura const*>(this); else return nullptr; }
304
305 DynObjAura* ToDynObjAura() { if (GetType() == DYNOBJ_AURA_TYPE) return reinterpret_cast<DynObjAura*>(this); else return nullptr; }
306 DynObjAura const* ToDynObjAura() const { if (GetType() == DYNOBJ_AURA_TYPE) return reinterpret_cast<DynObjAura const*>(this); else return nullptr; }
307
308 template <class Script>
310 {
311 return static_cast<Script*>(GetScriptByType(typeid(Script)));
312 }
313
314 std::vector<AuraScript*> m_loadedScripts;
315
317 {
319 DBStorageIterator(_effects.data(), _effects.size()),
320 DBStorageIterator(_effects.data(), _effects.size(), _effects.size()));
321 }
323 {
325 DBStorageIterator<AuraEffect const*>(_effects.data(), _effects.size()),
326 DBStorageIterator<AuraEffect const*>(_effects.data(), _effects.size(), _effects.size()));
327 }
328 std::size_t GetAuraEffectCount() const { return _effects.size(); }
329
330 virtual std::string GetDebugInfo() const;
331
333
334 Aura(Aura const&) = delete;
335 Aura(Aura&&) = delete;
336
337 Aura& operator=(Aura const&) = delete;
338 Aura& operator=(Aura&&) = delete;
339
340 private:
341 AuraScript* GetScriptByType(std::type_info const& type) const;
342 void _DeleteRemovedApplications();
343
344 protected:
345 SpellInfo const* const m_spellInfo;
349 ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
353 time_t const m_applyTime;
355
356 int32 m_maxDuration; // Max aura duration
357 int32 m_duration; // Current time
358 int32 m_timeCla; // Timer for power per sec calcultion
359 std::vector<SpellPowerEntry const*> m_periodicCosts;// Periodic costs
360 int32 m_updateTargetMapInterval; // Timer for UpdateTargetMapOfEffect
361
362 uint8 const m_casterLevel; // Aura level (store caster level for correct show level dep amount)
363 uint8 m_procCharges; // Aura charges (0 for infinite)
364 uint8 m_stackAmount; // Aura stack amount
365
367
369 bool m_isSingleTarget; // true if it's a single target spell and registered at caster - can change at spell steal for example
371
373
377
378 private:
379 std::vector<AuraApplication*> _removedApplications;
380
382
383 struct NoopAuraDeleter { void operator()(Aura*) const { /*noop - not managed*/ } };
385};
386
388{
389 friend Aura* Aura::Create(AuraCreateInfo& createInfo);
390 protected:
391 explicit UnitAura(AuraCreateInfo const& createInfo);
392 public:
393 void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication* aurApp) override;
394 void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* aurApp) override;
395
396 void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
397
398 void FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* caster) override;
399
400 // Allow Apply Aura Handler to modify and access m_AuraDRGroup
401 void SetDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
402 DiminishingGroup GetDiminishGroup() const { return m_AuraDRGroup; }
403
404 void AddStaticApplication(Unit* target, uint32 effMask);
405
406 void Heartbeat() override;
407 void HandlePeriodicFoodSpellVisualKit();
408
409 private:
411 std::unordered_map<ObjectGuid, uint32> _staticApplications; // non-area auras
412};
413
415{
416 friend Aura* Aura::Create(AuraCreateInfo& createInfo);
417 protected:
418 explicit DynObjAura(AuraCreateInfo const& createInfo);
419 public:
420 DynObjAura(SpellInfo const* spellproto, ObjectGuid castId, uint32 effMask, WorldObject* owner, Unit* caster, Difficulty castDifficulty, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint32 castItemId, int32 castItemLevel);
421
422 void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
423
424 void FillTargetMap(std::unordered_map<Unit*, uint32>& targets, Unit* caster) override;
425};
426
427#endif
Difficulty
Definition: DBCEnums.h:919
#define MAX_SPELL_EFFECTS
Definition: DBCEnums.h:2144
#define TC_GAME_API
Definition: Define.h:129
uint8_t uint8
Definition: Define.h:150
int32_t int32
Definition: Define.h:144
uint16_t uint16
Definition: Define.h:149
uint32_t uint32
Definition: Define.h:148
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
Definition: Duration.h:40
std::string GetDebugInfo()
Definition: Errors.cpp:157
#define ASSERT
Definition: Errors.h:68
Spells
Definition: PlayerAI.cpp:32
SpellEffIndex
Definition: SharedDefines.h:29
DiminishingGroup
AuraEffectHandleModes
AuraRemoveMode
@ AURA_REMOVE_BY_DEFAULT
AuraType
@ AFLAG_POSITIVE
@ AFLAG_NOCASTER
AuraObjectType
@ DYNOBJ_AURA_TYPE
@ UNIT_AURA_TYPE
std::vector< AuraEffect * > AuraEffectVector
Definition: SpellInfo.h:299
Unit * GetTarget() const
Definition: SpellAuras.h:79
void SetRemoveMode(AuraRemoveMode mode)
Definition: SpellAuras.h:93
uint16 GetSlot() const
Definition: SpellAuras.h:82
bool IsPositive() const
Definition: SpellAuras.h:86
uint32 _effectsToApply
Definition: SpellAuras.h:68
bool _needClientUpdate
Definition: SpellAuras.h:69
uint32 _effectMask
Definition: SpellAuras.h:70
Aura *const _base
Definition: SpellAuras.h:64
bool IsNeedClientUpdate() const
Definition: SpellAuras.h:97
uint16 GetFlags() const
Definition: SpellAuras.h:83
Aura * GetBase() const
Definition: SpellAuras.h:80
uint32 GetEffectsToApply() const
Definition: SpellAuras.h:89
uint32 GetEffectMask() const
Definition: SpellAuras.h:84
bool IsSelfcast() const
Definition: SpellAuras.h:87
AuraRemoveMode GetRemoveMode() const
Definition: SpellAuras.h:94
bool HasEffect(uint8 effect) const
Definition: SpellAuras.h:85
Unit *const _target
Definition: SpellAuras.h:63
AuraRemoveMode _removeMode
Definition: SpellAuras.h:65
UnitAura * ToUnitAura()
Definition: SpellAuras.h:302
Aura & operator=(Aura &&)=delete
ObjectGuid GetCastId() const
Definition: SpellAuras.h:141
static Aura * Create(AuraCreateInfo &createInfo)
Definition: SpellAuras.cpp:402
int32 GetMaxDuration() const
Definition: SpellAuras.h:171
Trinity::unique_trackable_ptr< Aura > m_scriptRef
Definition: SpellAuras.h:384
UnitAura const * ToUnitAura() const
Definition: SpellAuras.h:303
ApplicationMap const & GetApplicationMap()
Definition: SpellAuras.h:240
int32 GetCastItemLevel() const
Definition: SpellAuras.h:145
AuraEffectVector _effects
Definition: SpellAuras.h:381
int32 m_maxDuration
Definition: SpellAuras.h:356
Unit * GetUnitOwner() const
Definition: SpellAuras.h:150
void SetLastProcAttemptTime(TimePoint lastProcAttemptTime)
Definition: SpellAuras.h:264
time_t const m_applyTime
Definition: SpellAuras.h:353
Trinity::IteratorPair< DBStorageIterator< AuraEffect * > > GetAuraEffects()
Definition: SpellAuras.h:316
Trinity::IteratorPair< DBStorageIterator< AuraEffect const * > > GetAuraEffects() const
Definition: SpellAuras.h:322
DynamicObject * GetDynobjOwner() const
Definition: SpellAuras.h:151
void SetUsingCharges(bool val)
Definition: SpellAuras.h:256
void _RegisterForTargets()
Definition: SpellAuras.h:163
uint8 m_stackAmount
Definition: SpellAuras.h:364
ObjectGuid GetCasterGUID() const
Definition: SpellAuras.h:142
bool HasEffect(uint8 effIndex) const
Definition: SpellAuras.h:231
int32 m_duration
Definition: SpellAuras.h:357
bool IsRemoved() const
Definition: SpellAuras.h:208
std::vector< AuraApplication * > _removedApplications
Definition: SpellAuras.h:379
uint8 GetCasterLevel() const
Definition: SpellAuras.h:198
WorldObject * GetOwner() const
Definition: SpellAuras.h:149
uint32 GetId() const
Definition: SpellAuras.h:138
Aura(Aura const &)=delete
void SaveCasterInfo(Unit *caster)
TimePoint m_procCooldown
Definition: SpellAuras.h:374
ApplicationMap m_applications
Definition: SpellAuras.h:366
int32 GetDuration() const
Definition: SpellAuras.h:176
bool IsUsingCharges() const
Definition: SpellAuras.h:255
int32 m_castItemLevel
Definition: SpellAuras.h:351
uint32 GetCastItemId() const
Definition: SpellAuras.h:144
TimePoint m_lastProcSuccessTime
Definition: SpellAuras.h:376
ObjectGuid const m_castItemGuid
Definition: SpellAuras.h:349
int32 m_timeCla
Definition: SpellAuras.h:358
uint32 m_castItemId
Definition: SpellAuras.h:350
virtual void FillTargetMap(std::unordered_map< Unit *, uint32 > &targets, Unit *caster)=0
DynObjAura * ToDynObjAura()
Definition: SpellAuras.h:305
std::vector< AuraScript * > m_loadedScripts
Definition: SpellAuras.h:314
void ApplyForTargets()
Definition: SpellAuras.h:164
int32 CalcMaxDuration() const
Definition: SpellAuras.h:173
std::size_t GetAuraEffectCount() const
Definition: SpellAuras.h:328
SpellInfo const *const m_spellInfo
Definition: SpellAuras.h:345
TimePoint m_lastProcAttemptTime
Definition: SpellAuras.h:375
ObjectGuid const m_castId
Definition: SpellAuras.h:347
uint8 GetStackAmount() const
Definition: SpellAuras.h:192
Aura & operator=(Aura const &)=delete
uint8 GetCharges() const
Definition: SpellAuras.h:183
Trinity::unique_weak_ptr< Aura > GetWeakPtr() const
Definition: SpellAuras.h:332
WorldObject *const m_owner
Definition: SpellAuras.h:354
SpellInfo const * GetSpellInfo() const
Definition: SpellAuras.h:137
ObjectGuid GetCastItemGUID() const
Definition: SpellAuras.h:143
void SetMaxDuration(int32 duration)
Definition: SpellAuras.h:172
ObjectGuid const m_casterGuid
Definition: SpellAuras.h:348
uint8 const m_casterLevel
Definition: SpellAuras.h:362
Script * GetScript() const
Definition: SpellAuras.h:309
virtual void Heartbeat()
Definition: SpellAuras.h:266
void SetLastProcSuccessTime(TimePoint lastProcSuccessTime)
Definition: SpellAuras.h:265
Difficulty GetCastDifficulty() const
Definition: SpellAuras.h:139
void SetIsSingleTarget(bool val)
Definition: SpellAuras.h:212
bool IsExpired() const
Definition: SpellAuras.h:180
Aura(Aura &&)=delete
uint8 CalcMaxCharges() const
Definition: SpellAuras.h:186
bool m_isUsingCharges
Definition: SpellAuras.h:370
bool m_isRemoved
Definition: SpellAuras.h:368
time_t GetApplyTime() const
Definition: SpellAuras.h:170
std::vector< SpellPowerEntry const * > m_periodicCosts
Definition: SpellAuras.h:359
int32 m_updateTargetMapInterval
Definition: SpellAuras.h:360
Difficulty const m_castDifficulty
Definition: SpellAuras.h:346
DynObjAura const * ToDynObjAura() const
Definition: SpellAuras.h:306
std::unordered_map< ObjectGuid, AuraApplication * > ApplicationMap
Definition: SpellAuras.h:126
bool m_isSingleTarget
Definition: SpellAuras.h:369
uint8 m_procCharges
Definition: SpellAuras.h:363
SpellCastVisual const m_spellVisual
Definition: SpellAuras.h:352
bool IsPermanent() const
Definition: SpellAuras.h:181
ChargeDropEvent * m_dropEvent
Definition: SpellAuras.h:372
SpellCastVisual GetSpellVisual() const
Definition: SpellAuras.h:146
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: SpellAuras.h:188
bool IsSingleTarget() const
Definition: SpellAuras.h:210
DynObjAura(SpellInfo const *spellproto, ObjectGuid castId, uint32 effMask, WorldObject *owner, Unit *caster, Difficulty castDifficulty, int32 *baseAmount, Item *castItem, ObjectGuid casterGUID, ObjectGuid castItemGuid, uint32 castItemId, int32 castItemLevel)
Definition: Unit.h:459
Definition: Item.h:170
Trinity::unique_trackable_ptr< Object > m_scriptRef
Definition: Object.h:461
Utility class to enable range for loop syntax for multimap.equal_range uses.
Definition: IteratorPair.h:32
Trinity::unique_trackable_ptr companion class, replicating what std::weak_ptr is to std::shared_ptr.
DiminishingGroup m_AuraDRGroup
Definition: SpellAuras.h:410
void SetDiminishGroup(DiminishingGroup group)
Definition: SpellAuras.h:401
DiminishingGroup GetDiminishGroup() const
Definition: SpellAuras.h:402
std::unordered_map< ObjectGuid, uint32 > _staticApplications
Definition: SpellAuras.h:411
Definition: Unit.h:631
void apply(T *val)
Definition: ByteConverter.h:41
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
Definition: IteratorPair.h:48
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Definition: Vignette.cpp:81
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:101
void Remove(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:113
uint32 SpellId
Definition: SpellAuras.h:109
ObjectGuid Caster
Definition: SpellAuras.h:107
friend std::strong_ordering operator<=>(AuraKey const &left, AuraKey const &right)=default
ObjectGuid Item
Definition: SpellAuras.h:108
uint32 EffectMask
Definition: SpellAuras.h:110
std::array< int32, MAX_SPELL_EFFECTS > BaseAmounts
Definition: SpellAuras.h:118
std::array< int32, MAX_SPELL_EFFECTS > Amounts
Definition: SpellAuras.h:117
void operator()(Aura *) const
Definition: SpellAuras.h:383