TrinityCore
Loading...
Searching...
No Matches
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 "SpellAuraDefines.h"
22#include "SpellInfo.h"
23#include "UniqueTrackablePtr.h"
24
25class SpellInfo;
26struct SpellModifier;
27struct ProcTriggerSpell;
28struct SpellProcEntry;
29
30namespace WorldPackets
31{
32 namespace Spells
33 {
34 struct AuraInfo;
35 }
36}
37
38// forward decl
39class Aura;
40class AuraEffect;
41class AuraScript;
42class DamageInfo;
43class DispelInfo;
44class DynObjAura;
45class ChargeDropEvent;
46class DynamicObject;
47class ProcEventInfo;
48class Unit;
49class UnitAura;
50
51// update aura target map every 500 ms instead of every update - reduce amount of grid searcher calls
52#define UPDATE_TARGET_MAP_INTERVAL 500
53
55{
56 friend class Unit;
57
58 private:
59 Unit* const _target;
60 Aura* const _base;
61 AuraRemoveMode _removeMode; // Store info for know remove aura reason
62 uint8 _slot; // Aura slot on unit
63 uint8 _flags; // Aura info flag
64 uint8 _effectsToApply; // Used only at spell hit to determine which effect should be applied
66
67 explicit AuraApplication(Unit* target, Unit* caster, Aura* base, uint8 effMask);
68 void _Remove();
69
70 void _InitFlags(Unit* caster, uint8 effMask);
71 void _HandleEffect(uint8 effIndex, bool apply);
72
73 public:
74 Unit* GetTarget() const { return _target; }
75 Aura* GetBase() const { return _base; }
76
77 uint8 GetSlot() const { return _slot; }
78 uint8 GetFlags() const { return _flags; }
80 bool HasEffect(uint8 effect) const { ASSERT(effect < MAX_SPELL_EFFECTS); return (_flags & (1 << effect)) != 0; }
81 bool IsPositive() const { return (_flags & AFLAG_POSITIVE) != 0; }
82 bool IsSelfcast() const { return (_flags & AFLAG_SELF_CAST) != 0; }
83
84 uint8 GetEffectsToApply() const { return _effectsToApply; }
85 void UpdateApplyEffectMask(uint8 newEffMask, bool canHandleNewEffects);
86
87 void SetRemoveMode(AuraRemoveMode mode) { _removeMode = mode; }
88 AuraRemoveMode GetRemoveMode() const { return _removeMode; }
89
90 void SetNeedClientUpdate() { _needClientUpdate = true;}
91 bool IsNeedClientUpdate() const { return _needClientUpdate;}
92 void BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo, bool remove) const;
93 void ClientUpdate(bool remove = false);
94
95 std::string GetDebugInfo() const;
96};
97
98// Structure representing database aura primary key fields
99struct AuraKey
100{
105
106 friend std::strong_ordering operator<=>(AuraKey const& left, AuraKey const& right) = default;
107};
108
110{
111 std::array<int32, MAX_SPELL_EFFECTS> Amounts;
112 std::array<int32, MAX_SPELL_EFFECTS> BaseAmounts;
113};
114
115// Caches some information about caster (because it may no longer exist)
117{
118 float CritChance = 0.f;
119 float BonusDonePct = 0.f;
121 bool ApplyResilience = false;
122};
123
125{
126 friend class Unit;
127
128 public:
129 typedef std::unordered_map<ObjectGuid, AuraApplication*> ApplicationMap;
130
131 static uint8 BuildEffectMaskForOwner(SpellInfo const* spellProto, uint8 availableEffectMask, WorldObject* owner);
132 static Aura* TryRefreshStackOrCreate(AuraCreateInfo& createInfo, bool updateEffectMask = true);
133 static Aura* TryCreate(AuraCreateInfo& createInfo);
134 static Aura* Create(AuraCreateInfo& createInfo);
135 explicit Aura(AuraCreateInfo const& createInfo);
136 void _InitEffects(uint8 effMask, Unit* caster, int32 const* baseAmount);
137 void SaveCasterInfo(Unit* caster);
138 virtual ~Aura();
139
140 SpellInfo const* GetSpellInfo() const { return m_spellInfo; }
141 uint32 GetId() const{ return GetSpellInfo()->Id; }
142
143 ObjectGuid GetCastItemGUID() const { return m_castItemGuid; }
144 ObjectGuid GetCasterGUID() const { return m_casterGuid; }
145 Unit* GetCaster() const;
146 WorldObject* GetOwner() const { return m_owner; }
147 Unit* GetUnitOwner() const { ASSERT(GetType() == UNIT_AURA_TYPE); return m_owner->ToUnit(); }
148 DynamicObject* GetDynobjOwner() const { ASSERT(GetType() == DYNOBJ_AURA_TYPE); return m_owner->ToDynObject(); }
149
150 AuraObjectType GetType() const;
151
152 virtual void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication * auraApp);
153 virtual void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication * auraApp);
154 void _Remove(AuraRemoveMode removeMode);
155 virtual void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) = 0;
156
157 virtual void FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* caster) = 0;
158 void UpdateTargetMap(Unit* caster, bool apply = true);
159
160 void _RegisterForTargets() { Unit* caster = GetCaster(); UpdateTargetMap(caster, false); }
161 void ApplyForTargets() { Unit* caster = GetCaster(); UpdateTargetMap(caster, true); }
162 void _ApplyEffectForTargets(uint8 effIndex);
163
164 void UpdateOwner(uint32 diff, WorldObject* owner);
165 void Update(uint32 diff, Unit* caster);
166
167 time_t GetApplyTime() const { return m_applyTime; }
168 int32 GetMaxDuration() const { return m_maxDuration; }
169 void SetMaxDuration(int32 duration) { m_maxDuration = duration; }
170 int32 CalcMaxDuration() const { return CalcMaxDuration(GetCaster()); }
171 int32 CalcMaxDuration(Unit* caster) const;
172 static int32 CalcMaxDuration(SpellInfo const* spellInfo, WorldObject* caster);
173 int32 GetDuration() const { return m_duration; }
174 void SetDuration(int32 duration, bool withMods = false);
175 void RefreshDuration(bool withMods = false);
176 void RefreshTimers(bool resetPeriodicTimer);
177 bool IsExpired() const { return !GetDuration() && !m_dropEvent; }
178 bool IsPermanent() const { return GetMaxDuration() == -1; }
179
180 uint8 GetCharges() const { return m_procCharges; }
181 void SetCharges(uint8 charges);
182 uint8 CalcMaxCharges(Unit* caster) const;
183 uint8 CalcMaxCharges() const { return CalcMaxCharges(GetCaster()); }
184 bool ModCharges(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
185 bool DropCharge(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) { return ModCharges(-1, removeMode); }
186 void ModChargesDelayed(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
187 void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
188
189 uint8 GetStackAmount() const { return m_stackAmount; }
190 void SetStackAmount(uint8 num);
191 bool ModStackAmount(int32 num, AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT, bool resetPeriodicTimer = true);
192
193 bool CanApplyResilience() const { return _casterInfo.ApplyResilience; }
194 void SetCanApplyResilience(bool val) { _casterInfo.ApplyResilience = val; }
195 uint8 GetCasterLevel() const { return _casterInfo.Level; }
196 float GetCritChance() const { return _casterInfo.CritChance; }
197 void SetCritChance(float val) { _casterInfo.CritChance = val; }
198 float GetDonePct() const { return _casterInfo.BonusDonePct; }
199 void SetDonePct(float val) { _casterInfo.BonusDonePct = val; }
200
201 bool HasMoreThanOneEffectForType(AuraType auraType) const;
202 bool IsArea() const;
203 bool IsPassive() const;
204 bool IsDeathPersistent() const;
205
206 bool IsRemovedOnShapeLost(Unit* target) const;
207
208 bool CanBeSaved() const;
209 bool IsRemoved() const { return m_isRemoved; }
210 bool CanBeSentToClient() const;
211 // Single cast aura helpers
212 bool IsSingleTarget() const {return m_isSingleTarget; }
213 bool IsSingleTargetWith(Aura const* aura) const;
214 void SetIsSingleTarget(bool val) { m_isSingleTarget = val; }
215 void UnregisterSingleTarget();
216 int32 CalcDispelChance(Unit const* auraTarget, bool offensive) const;
217
218 void SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint8 stackAmount, uint8 recalculateMask, float critChance, bool applyResilience, int32* amount);
219
220 // helpers for aura effects
221 bool CanPeriodicTickCrit(Unit const* caster) const;
222 float CalcPeriodicCritChance(Unit const* caster) const;
223
224 bool HasEffect(uint8 effIndex) const { return GetEffect(effIndex) != nullptr; }
225 bool HasEffectType(AuraType type) const;
226 AuraEffect* GetEffect(uint8 effIndex) const { ASSERT (effIndex < MAX_SPELL_EFFECTS); return m_effects[effIndex]; }
227 uint8 GetEffectMask() const { uint8 effMask = 0; for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i) if (m_effects[i]) effMask |= 1<<i; return effMask; }
228 void RecalculateAmountOfEffects();
229 void HandleAllEffects(AuraApplication * aurApp, uint8 mode, bool apply);
230
231 // Helpers for targets
232 ApplicationMap const& GetApplicationMap() { return m_applications; }
233 void GetApplicationVector(std::vector<AuraApplication*>& applicationVector) const;
234 AuraApplication const* GetApplicationOfTarget(ObjectGuid guid) const { ApplicationMap::const_iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return nullptr; }
235 AuraApplication* GetApplicationOfTarget(ObjectGuid guid) { ApplicationMap::iterator itr = m_applications.find(guid); if (itr != m_applications.end()) return itr->second; return nullptr; }
236 bool IsAppliedOnTarget(ObjectGuid guid) const { return m_applications.find(guid) != m_applications.end(); }
237
238 void SetNeedClientUpdateForTargets() const;
239 void HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, bool apply, bool onReapply);
240 bool CanBeAppliedOn(Unit* target);
241 bool CheckAreaTarget(Unit* target);
242 bool CanStackWith(Aura const* existingAura) const;
243
244 bool IsProcOnCooldown(TimePoint now) const;
245 void AddProcCooldown(TimePoint cooldownEnd);
246 void ResetProcCooldown();
247 bool IsUsingCharges() const { return m_isUsingCharges; }
248 void SetUsingCharges(bool val) { m_isUsingCharges = val; }
249 void PrepareProcToTrigger(AuraApplication* aurApp, ProcEventInfo& eventInfo, TimePoint now);
250 uint8 GetProcEffectMask(AuraApplication* aurApp, ProcEventInfo& eventInfo, TimePoint now) const;
251 float CalcProcChance(SpellProcEntry const& procEntry, ProcEventInfo& eventInfo) const;
252 void TriggerProcOnEvent(uint8 procEffectMask, AuraApplication* aurApp, ProcEventInfo& eventInfo);
253
254 // AuraScript
255 void LoadScripts();
256 bool CallScriptCheckAreaTargetHandlers(Unit* target);
257 void CallScriptDispel(DispelInfo* dispelInfo);
258 void CallScriptAfterDispel(DispelInfo* dispelInfo);
259 bool CallScriptEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
260 bool CallScriptEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
261 void CallScriptAfterEffectApplyHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
262 void CallScriptAfterEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, AuraEffectHandleModes mode);
263 bool CallScriptEffectPeriodicHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp);
264 void CallScriptEffectUpdatePeriodicHandlers(AuraEffect* aurEff);
265 void CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated);
266 void CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude);
267 void CallScriptEffectCalcSpellModHandlers(AuraEffect const* aurEff, SpellModifier*& spellMod);
268 void CallScriptEffectAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount, bool& defaultPrevented);
269 void CallScriptEffectAfterAbsorbHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount);
270 void CallScriptEffectManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount, bool& defaultPrevented);
271 void CallScriptEffectAfterManaShieldHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& absorbAmount);
272 void CallScriptEffectSplitHandlers(AuraEffect* aurEff, AuraApplication const* aurApp, DamageInfo& dmgInfo, uint32& splitAmount);
273 // Spell Proc Hooks
274 bool CallScriptCheckProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
275 bool CallScriptCheckEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
276 bool CallScriptPrepareProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
277 bool CallScriptProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
278 void CallScriptAfterProcHandlers(AuraApplication const* aurApp, ProcEventInfo& eventInfo);
279 bool CallScriptEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
280 void CallScriptAfterEffectProcHandlers(AuraEffect const* aurEff, AuraApplication const* aurApp, ProcEventInfo& eventInfo);
281
282 UnitAura* ToUnitAura() { if (GetType() == UNIT_AURA_TYPE) return reinterpret_cast<UnitAura*>(this); else return nullptr; }
283 UnitAura const* ToUnitAura() const { if (GetType() == UNIT_AURA_TYPE) return reinterpret_cast<UnitAura const*>(this); else return nullptr; }
284
285 DynObjAura* ToDynObjAura() { if (GetType() == DYNOBJ_AURA_TYPE) return reinterpret_cast<DynObjAura*>(this); else return nullptr; }
286 DynObjAura const* ToDynObjAura() const { if (GetType() == DYNOBJ_AURA_TYPE) return reinterpret_cast<DynObjAura const*>(this); else return nullptr; }
287
288 template <class Script>
289 Script* GetScript(std::string const& scriptName) const
290 {
291 return dynamic_cast<Script*>(GetScriptByName(scriptName));
292 }
293
294 std::vector<AuraScript*> m_loadedScripts;
295
296 virtual std::string GetDebugInfo() const;
297
298 Trinity::unique_weak_ptr<Aura> GetWeakPtr() const { return m_scriptRef; }
299
300 Aura(Aura const&) = delete;
301 Aura(Aura&&) = delete;
302
303 Aura& operator=(Aura const&) = delete;
304 Aura& operator=(Aura&&) = delete;
305
306 private:
307 AuraScript* GetScriptByName(std::string const& scriptName) const;
308 void _DeleteRemovedApplications();
309
310 protected:
311 SpellInfo const* const m_spellInfo;
313 ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
314 time_t const m_applyTime;
316
317 int32 m_maxDuration; // Max aura duration
318 int32 m_duration; // Current time
319 int32 m_timeCla; // Timer for power per sec calcultion
320 int32 m_updateTargetMapInterval; // Timer for UpdateTargetMapOfEffect
321
323 uint8 m_procCharges; // Aura charges (0 for infinite)
324 uint8 m_stackAmount; // Aura stack amount
325
328
330 bool m_isSingleTarget; // true if it's a single target spell and registered at caster - can change at spell steal for example
332
334
336
337 private:
338 std::vector<AuraApplication*> _removedApplications;
339
340 struct NoopAuraDeleter { void operator()(Aura*) const { /*noop - not managed*/ } };
342};
343
345{
346 friend Aura* Aura::Create(AuraCreateInfo& createInfo);
347 protected:
348 explicit UnitAura(AuraCreateInfo const& createInfo);
349 public:
350 void _ApplyForTarget(Unit* target, Unit* caster, AuraApplication* aurApp) override;
351 void _UnapplyForTarget(Unit* target, Unit* caster, AuraApplication* aurApp) override;
352
353 void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
354
355 void FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* caster) override;
356
357 // Allow Apply Aura Handler to modify and access m_AuraDRGroup
358 void SetDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
359 DiminishingGroup GetDiminishGroup() const { return m_AuraDRGroup; }
360
361 void AddStaticApplication(Unit* target, uint8 effMask);
362
363 private:
365 std::unordered_map<ObjectGuid, uint8> _staticApplications; // non-area auras
366};
367
369{
370 friend Aura* Aura::Create(AuraCreateInfo& createInfo);
371 protected:
372 explicit DynObjAura(AuraCreateInfo const& createInfo);
373 public:
374 void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT) override;
375
376 void FillTargetMap(std::unordered_map<Unit*, uint8>& targets, Unit* caster) override;
377};
378
380{
381 friend class Aura;
382 protected:
383 ChargeDropEvent(Aura* base, AuraRemoveMode mode) : _base(base), _mode(mode) { }
384 bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override;
385
386 private:
389};
390
391#endif
#define MAX_SPELL_EFFECTS
Definition DBCEnums.h:386
#define TC_GAME_API
Definition Define.h:114
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint64_t uint64
Definition Define.h:132
uint32_t uint32
Definition Define.h:133
std::chrono::steady_clock::time_point TimePoint
time_point shorthand typedefs
Definition Duration.h:36
std::string GetDebugInfo()
Definition Errors.cpp:155
#define ASSERT
Definition Errors.h:68
Spells
Definition PlayerAI.cpp:32
DiminishingGroup
AuraRemoveMode
@ AURA_REMOVE_BY_DEFAULT
AuraEffectHandleModes
@ AFLAG_POSITIVE
@ AFLAG_EFF_INDEX_1
@ AFLAG_SELF_CAST
@ AFLAG_EFF_INDEX_2
@ AFLAG_EFF_INDEX_0
AuraObjectType
@ DYNOBJ_AURA_TYPE
@ UNIT_AURA_TYPE
Unit * GetTarget() const
Definition SpellAuras.h:74
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:87
bool IsPositive() const
Definition SpellAuras.h:81
uint8 _effectsToApply
Definition SpellAuras.h:64
bool _needClientUpdate
Definition SpellAuras.h:65
uint8 GetEffectMask() const
Definition SpellAuras.h:79
Aura *const _base
Definition SpellAuras.h:60
uint8 GetFlags() const
Definition SpellAuras.h:78
bool IsNeedClientUpdate() const
Definition SpellAuras.h:91
uint8 GetEffectsToApply() const
Definition SpellAuras.h:84
Aura * GetBase() const
Definition SpellAuras.h:75
uint8 GetSlot() const
Definition SpellAuras.h:77
void SetNeedClientUpdate()
Definition SpellAuras.h:90
bool IsSelfcast() const
Definition SpellAuras.h:82
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:88
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:80
Unit *const _target
Definition SpellAuras.h:59
AuraRemoveMode _removeMode
Definition SpellAuras.h:61
UnitAura * ToUnitAura()
Definition SpellAuras.h:282
Aura & operator=(Aura &&)=delete
static Aura * Create(AuraCreateInfo &createInfo)
int32 GetMaxDuration() const
Definition SpellAuras.h:168
Trinity::unique_trackable_ptr< Aura > m_scriptRef
Definition SpellAuras.h:341
UnitAura const * ToUnitAura() const
Definition SpellAuras.h:283
void SetCritChance(float val)
Definition SpellAuras.h:197
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:232
int32 m_maxDuration
Definition SpellAuras.h:317
Unit * GetUnitOwner() const
Definition SpellAuras.h:147
time_t const m_applyTime
Definition SpellAuras.h:314
AuraApplication const * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:234
DynamicObject * GetDynobjOwner() const
Definition SpellAuras.h:148
void SetUsingCharges(bool val)
Definition SpellAuras.h:248
void _RegisterForTargets()
Definition SpellAuras.h:160
uint8 m_stackAmount
Definition SpellAuras.h:324
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:144
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:224
int32 m_duration
Definition SpellAuras.h:318
bool IsRemoved() const
Definition SpellAuras.h:209
std::vector< AuraApplication * > _removedApplications
Definition SpellAuras.h:338
float GetCritChance() const
Definition SpellAuras.h:196
uint8 GetCasterLevel() const
Definition SpellAuras.h:195
WorldObject * GetOwner() const
Definition SpellAuras.h:146
uint32 GetId() const
Definition SpellAuras.h:141
Aura(Aura const &)=delete
TimePoint m_procCooldown
Definition SpellAuras.h:335
void SetCanApplyResilience(bool val)
Definition SpellAuras.h:194
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:236
ApplicationMap m_applications
Definition SpellAuras.h:327
int32 GetDuration() const
Definition SpellAuras.h:173
bool IsUsingCharges() const
Definition SpellAuras.h:247
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:226
ObjectGuid const m_castItemGuid
Definition SpellAuras.h:313
bool CanApplyResilience() const
Definition SpellAuras.h:193
int32 m_timeCla
Definition SpellAuras.h:319
DynObjAura * ToDynObjAura()
Definition SpellAuras.h:285
std::vector< AuraScript * > m_loadedScripts
Definition SpellAuras.h:294
void ApplyForTargets()
Definition SpellAuras.h:161
int32 CalcMaxDuration() const
Definition SpellAuras.h:170
uint8 GetEffectMask() const
Definition SpellAuras.h:227
SpellInfo const *const m_spellInfo
Definition SpellAuras.h:311
float GetDonePct() const
Definition SpellAuras.h:198
uint8 GetStackAmount() const
Definition SpellAuras.h:189
Aura & operator=(Aura const &)=delete
uint8 GetCharges() const
Definition SpellAuras.h:180
Trinity::unique_weak_ptr< Aura > GetWeakPtr() const
Definition SpellAuras.h:298
WorldObject *const m_owner
Definition SpellAuras.h:315
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:140
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:143
CasterInfo _casterInfo
Definition SpellAuras.h:322
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:169
ObjectGuid const m_casterGuid
Definition SpellAuras.h:312
AuraApplication * GetApplicationOfTarget(ObjectGuid guid)
Definition SpellAuras.h:235
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:214
bool IsExpired() const
Definition SpellAuras.h:177
Aura(Aura &&)=delete
uint8 CalcMaxCharges() const
Definition SpellAuras.h:183
bool m_isUsingCharges
Definition SpellAuras.h:331
void SetDonePct(float val)
Definition SpellAuras.h:199
virtual void FillTargetMap(std::unordered_map< Unit *, uint8 > &targets, Unit *caster)=0
bool m_isRemoved
Definition SpellAuras.h:329
time_t GetApplyTime() const
Definition SpellAuras.h:167
int32 m_updateTargetMapInterval
Definition SpellAuras.h:320
DynObjAura const * ToDynObjAura() const
Definition SpellAuras.h:286
std::unordered_map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:129
Script * GetScript(std::string const &scriptName) const
Definition SpellAuras.h:289
bool m_isSingleTarget
Definition SpellAuras.h:330
uint8 m_procCharges
Definition SpellAuras.h:323
bool IsPermanent() const
Definition SpellAuras.h:178
ChargeDropEvent * m_dropEvent
Definition SpellAuras.h:333
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.h:185
bool IsSingleTarget() const
Definition SpellAuras.h:212
AuraRemoveMode _mode
Definition SpellAuras.h:388
ChargeDropEvent(Aura *base, AuraRemoveMode mode)
Definition SpellAuras.h:383
Specialized variant of std::shared_ptr that enforces unique ownership and/or std::unique_ptr with std...
Trinity::unique_trackable_ptr companion class, replicating what std::weak_ptr is to std::shared_ptr.
DiminishingGroup m_AuraDRGroup
Definition SpellAuras.h:364
void SetDiminishGroup(DiminishingGroup group)
Definition SpellAuras.h:358
DiminishingGroup GetDiminishGroup() const
Definition SpellAuras.h:359
std::unordered_map< ObjectGuid, uint8 > _staticApplications
Definition SpellAuras.h:365
Definition Unit.h:783
uint8 EffectMask
Definition SpellAuras.h:104
uint32 SpellId
Definition SpellAuras.h:103
ObjectGuid Caster
Definition SpellAuras.h:101
friend std::strong_ordering operator<=>(AuraKey const &left, AuraKey const &right)=default
ObjectGuid Item
Definition SpellAuras.h:102
std::array< int32, MAX_SPELL_EFFECTS > BaseAmounts
Definition SpellAuras.h:112
std::array< int32, MAX_SPELL_EFFECTS > Amounts
Definition SpellAuras.h:111
void operator()(Aura *) const
Definition SpellAuras.h:340
uint8 Level
Definition SpellAuras.h:120
float CritChance
Definition SpellAuras.h:118
float BonusDonePct
Definition SpellAuras.h:119
bool ApplyResilience
Definition SpellAuras.h:121