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