TrinityCore
SpellAuraEffects.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_SPELLAURAEFFECTS_H
19#define TRINITY_SPELLAURAEFFECTS_H
20
21#include "SpellAuras.h"
22
23class AuraEffect;
24class Unit;
25class WorldObject;
26
27typedef void(AuraEffect::*pAuraEffectHandler)(AuraApplication const* aurApp, uint8 mode, bool apply) const;
28
30{
31 friend void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 const* baseAmount);
32 friend Aura::~Aura();
33 friend class Unit;
34
35 private:
37 explicit AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster);
38
39 public:
40 Unit* GetCaster() const { return GetBase()->GetCaster(); }
41 ObjectGuid GetCasterGUID() const { return GetBase()->GetCasterGUID(); }
42 Aura* GetBase() const { return m_base; }
43
44 template <typename Container>
45 void GetTargetList(Container& targetContainer) const;
46
47 template <typename Container>
48 void GetApplicationList(Container& applicationContainer) const;
49
50 SpellInfo const* GetSpellInfo() const { return m_spellInfo; }
51 uint32 GetId() const { return m_spellInfo->Id; }
52 SpellEffIndex GetEffIndex() const { return m_effectInfo.EffectIndex; }
53 int32 GetBaseAmount() const { return m_baseAmount; }
54 int32 GetPeriod() const { return _period; }
55
56 int32 GetMiscValueB() const { return GetSpellEffectInfo().MiscValueB; }
57 int32 GetMiscValue() const { return GetSpellEffectInfo().MiscValue; }
58 AuraType GetAuraType() const { return GetSpellEffectInfo().ApplyAuraName; }
59 int32 GetAmount() const { return _amount; }
60 void SetAmount(int32 amount) { _amount = amount; m_canBeRecalculated = false; }
61
62 Optional<float> GetEstimatedAmount() const { return _estimatedAmount; }
63
64 int32 GetPeriodicTimer() const { return _periodicTimer; }
65 void SetPeriodicTimer(int32 periodicTimer) { _periodicTimer = periodicTimer; }
66
67 int32 CalculateAmount(Unit* caster);
68 static Optional<float> CalculateEstimatedAmount(Unit const* caster, Unit* target, SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, int32 amount, uint8 stack, AuraEffect const* aurEff);
69 Optional<float> CalculateEstimatedAmount(Unit const* caster, int32 amount) const;
70 static float CalculateEstimatedfTotalPeriodicAmount(Unit* caster, Unit* target, SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, float amount, uint8 stack);
71 void CalculatePeriodic(Unit* caster, bool resetPeriodicTimer = true, bool load = false);
72 void CalculateSpellMod();
73 void ChangeAmount(int32 newAmount, bool mark = true, bool onStackOrReapply = false, AuraEffect const* triggeredBy = nullptr);
74 void RecalculateAmount(AuraEffect const* triggeredBy = nullptr) { if (!CanBeRecalculated()) return; ChangeAmount(CalculateAmount(GetCaster()), false, false, triggeredBy); }
75 void RecalculateAmount(Unit* caster, AuraEffect const* triggeredBy = nullptr) { if (!CanBeRecalculated()) return; ChangeAmount(CalculateAmount(caster), false, false, triggeredBy); }
76 bool CanBeRecalculated() const { return m_canBeRecalculated; }
77 void SetCanBeRecalculated(bool val) { m_canBeRecalculated = val; }
78 void HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply, AuraEffect const* triggeredBy = nullptr);
79 void HandleEffect(Unit* target, uint8 mode, bool apply, AuraEffect const* triggeredBy = nullptr);
80 void ApplySpellMod(Unit* target, bool apply, AuraEffect const* triggeredBy = nullptr);
81
82 void Update(uint32 diff, Unit* caster);
83
84 uint32 GetTickNumber() const { return _ticksDone; }
85 uint32 GetRemainingTicks() const { return GetTotalTicks() - _ticksDone; }
86 uint32 GetTotalTicks() const;
87 void ResetPeriodic(bool resetPeriodicTimer = false);
88 void ResetTicks() { _ticksDone = 0; }
89
90 bool IsPeriodic() const { return m_isPeriodic; }
91 void SetPeriodic(bool isPeriodic) { m_isPeriodic = isPeriodic; }
92 bool IsAffectingSpell(SpellInfo const* spell) const;
93 bool HasSpellClassMask() const { return !!GetSpellEffectInfo().SpellClassMask; }
94
95 void SendTickImmune(Unit* target, Unit* caster) const;
96 void PeriodicTick(AuraApplication* aurApp, Unit* caster) const;
97
98 bool CheckEffectProc(AuraApplication* aurApp, ProcEventInfo& eventInfo) const;
99 void HandleProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
100
101 // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
102 void HandleShapeshiftBoosts(Unit* target, bool apply) const;
103
104 SpellEffectInfo const& GetSpellEffectInfo() const { return m_effectInfo; }
105
106 bool IsEffect() const { return m_effectInfo.Effect != 0; }
107 bool IsEffect(SpellEffectName effectName) const { return m_effectInfo.Effect == effectName; }
108 bool IsAreaAuraEffect() const;
109
110 private:
111 Aura* const m_base;
112
113 SpellInfo const* const m_spellInfo;
115
117
120 Optional<float> _estimatedAmount; // for periodic damage and healing auras this will include damage done bonuses
121
122 // periodic stuff
124 int32 _period; // time between consecutive ticks
125 uint32 _ticksDone; // ticks counter
126
129
130 float GetCritChanceFor(Unit const* caster, Unit const* target) const;
131
132 public:
133 // aura effect apply/remove handlers
134 void HandleNULL(AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/) const
135 {
136 // not implemented
137 }
138 void HandleUnused(AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/) const
139 {
140 // useless
141 }
142 void HandleNoImmediateEffect(AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/) const
143 {
144 // aura type not have immediate effect at add/remove and handled by ID in other code place
145 }
146 // visibility & phases
147 void HandleModInvisibilityDetect(AuraApplication const* aurApp, uint8 mode, bool apply) const;
148 void HandleModInvisibility(AuraApplication const* aurApp, uint8 mode, bool apply) const;
149 void HandleModStealth(AuraApplication const* aurApp, uint8 mode, bool apply) const;
150 void HandleModStealthLevel(AuraApplication const* aurApp, uint8 mode, bool apply) const;
151 void HandleModStealthDetect(AuraApplication const* aurApp, uint8 mode, bool apply) const;
152 void HandleDetectAmore(AuraApplication const* aurApp, uint8 mode, bool apply) const;
153 void HandleSpiritOfRedemption(AuraApplication const* aurApp, uint8 mode, bool apply) const;
154 void HandleAuraGhost(AuraApplication const* aurApp, uint8 mode, bool apply) const;
155 void HandlePhase(AuraApplication const* aurApp, uint8 mode, bool apply) const;
156 void HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, bool apply) const;
157 void HandlePhaseAlwaysVisible(AuraApplication const* aurApp, uint8 mode, bool apply) const;
158
159 // unit model
160 void HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mode, bool apply) const;
161 void HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, bool apply) const;
162 void HandleAuraModScale(AuraApplication const* aurApp, uint8 mode, bool apply) const;
163 void HandleAuraCloneCaster(AuraApplication const* aurApp, uint8 mode, bool apply) const;
164 // fight
165 void HandleFeignDeath(AuraApplication const* aurApp, uint8 mode, bool apply) const;
166 void HandleModUnattackable(AuraApplication const* aurApp, uint8 mode, bool apply) const;
167 void HandleAuraModDisarm(AuraApplication const* aurApp, uint8 mode, bool apply) const;
168 void HandleAuraModSilence(AuraApplication const* aurApp, uint8 mode, bool apply) const;
169 void HandleAuraModPacify(AuraApplication const* aurApp, uint8 mode, bool apply) const;
170 void HandleAuraModPacifyAndSilence(AuraApplication const* aurApp, uint8 mode, bool apply) const;
171 void HandleAuraModNoActions(AuraApplication const* aurApp, uint8 mode, bool apply) const;
172 // tracking
173 void HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 mode, bool apply) const;
174 void HandleAuraTrackStealthed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
175 void HandleAuraModStalked(AuraApplication const* aurApp, uint8 mode, bool apply) const;
176 void HandleAuraUntrackable(AuraApplication const* aurApp, uint8 mode, bool apply) const;
177 // skills & talents
178 void HandleAuraModSkill(AuraApplication const* aurApp, uint8 mode, bool apply) const;
179 void HandleAuraAllowTalentSwapping(AuraApplication const* aurApp, uint8 mode, bool apply) const;
180 // movement
181 void HandleAuraMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const;
182 void HandleAuraAllowFlight(AuraApplication const* aurApp, uint8 mode, bool apply) const;
183 void HandleAuraWaterWalk(AuraApplication const* aurApp, uint8 mode, bool apply) const;
184 void HandleAuraFeatherFall(AuraApplication const* aurApp, uint8 mode, bool apply) const;
185 void HandleAuraHover(AuraApplication const* aurApp, uint8 mode, bool apply) const;
186 void HandleWaterBreathing(AuraApplication const* aurApp, uint8 mode, bool apply) const;
187 void HandleForceMoveForward(AuraApplication const* aurApp, uint8 mode, bool apply) const;
188 void HandleAuraCanTurnWhileFalling(AuraApplication const* aurApp, uint8 mode, bool apply) const;
189 void HandleIgnoreMovementForces(AuraApplication const* aurApp, uint8 mode, bool apply) const;
190 void HandleDisableInertia(AuraApplication const* aurApp, uint8 mode, bool apply) const;
191 // threat
192 void HandleModThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
193 void HandleAuraModTotalThreat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
194 void HandleModTaunt(AuraApplication const* aurApp, uint8 mode, bool apply) const;
195 void HandleModDetaunt(AuraApplication const* aurApp, uint8 mode, bool apply) const;
196 void HandleAuraModFixate(AuraApplication const* aurApp, uint8 mode, bool apply) const;
197 // control
198 void HandleModConfuse(AuraApplication const* aurApp, uint8 mode, bool apply) const;
199 void HandleModFear(AuraApplication const* aurApp, uint8 mode, bool apply) const;
200 void HandleAuraModStun(AuraApplication const* aurApp, uint8 mode, bool apply) const;
201 void HandleAuraModRoot(AuraApplication const* aurApp, uint8 mode, bool apply) const;
202 void HandlePreventFleeing(AuraApplication const* aurApp, uint8 mode, bool apply) const;
203 void HandleAuraModRootAndDisableGravity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
204 void HandleAuraModStunAndDisableGravity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
205 // charm
206 void HandleModPossess(AuraApplication const* aurApp, uint8 mode, bool apply) const;
207 void HandleModPossessPet(AuraApplication const* aurApp, uint8 mode, bool apply) const;
208 void HandleModCharm(AuraApplication const* aurApp, uint8 mode, bool apply) const;
209 void HandleCharmConvert(AuraApplication const* aurApp, uint8 mode, bool apply) const;
210 void HandleAuraControlVehicle(AuraApplication const* aurApp, uint8 mode, bool apply) const;
211 // modify speed
212 void HandleAuraModIncreaseSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
213 void HandleAuraModIncreaseMountedSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
214 void HandleAuraModIncreaseFlightSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
215 void HandleAuraModIncreaseSwimSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
216 void HandleAuraModDecreaseSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
217 void HandleAuraModUseNormalSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
218 void HandleAuraModMinimumSpeedRate(AuraApplication const* aurApp, uint8 mode, bool apply) const;
219 void HandleModMovementForceMagnitude(AuraApplication const* aurApp, uint8 mode, bool apply) const;
220 // immunity
221 void HandleModMechanicImmunityMask(AuraApplication const* aurApp, uint8 mode, bool apply) const;
222 void HandleModMechanicImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
223 void HandleAuraModEffectImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
224 void HandleAuraModStateImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
225 void HandleAuraModSchoolImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
226 void HandleAuraModDmgImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
227 void HandleAuraModDispelImmunity(AuraApplication const* aurApp, uint8 mode, bool apply) const;
228 // modify stats
229 // resistance
230 void HandleAuraModResistance(AuraApplication const* aurApp, uint8 mode, bool apply) const;
231 void HandleAuraModBaseResistancePCT(AuraApplication const* aurApp, uint8 mode, bool apply) const;
232 void HandleModResistancePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
233 void HandleModBaseResistance(AuraApplication const* aurApp, uint8 mode, bool apply) const;
234 void HandleModTargetResistance(AuraApplication const* aurApp, uint8 mode, bool apply) const;
235 // stat
236 void HandleAuraModStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
237 void HandleModPercentStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
238 void HandleModSpellDamagePercentFromStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
239 void HandleModSpellHealingPercentFromStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
240 void HandleModHealingDone(AuraApplication const* aurApp, uint8 mode, bool apply) const;
241 void HandleModHealingDonePct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
242 void HandleModTotalPercentStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
243 void HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mode, bool apply) const;
244 void HandleModBonusArmor(AuraApplication const* aurApp, uint8 mode, bool apply) const;
245 void HandleModBonusArmorPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
246 void HandleModArmorPctFromStat(AuraApplication const* aurApp, uint8 mode, bool apply) const;
247 void HandleModStatBonusPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
248 void HandleOverrideSpellPowerByAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
249 void HandleOverrideAttackPowerBySpellPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
250 void HandleModVersatilityByPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
251 void HandleAuraModMaxPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
252 // heal and energize
253 void HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, bool apply) const;
254 void HandleModPowerRegenPCT(AuraApplication const* aurApp, uint8 mode, bool apply) const;
255 void HandleModManaRegenPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
256 void HandleAuraModIncreaseHealth(AuraApplication const* aurApp, uint8 mode, bool apply) const;
257 void HandleAuraModIncreaseMaxHealth(AuraApplication const* aurApp, uint8 mode, bool apply) const;
258 void HandleAuraModIncreaseEnergy(AuraApplication const* aurApp, uint8 mode, bool apply) const;
259 void HandleAuraModIncreaseEnergyPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
260 void HandleAuraModIncreaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
261 void HandleAuraIncreaseBaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
262 void HandleAuraModIncreaseBaseManaPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
263 void HandleModManaCostPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
264 void HandleAuraModPowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const;
265 void HandleAuraModOverridePowerDisplay(AuraApplication const* aurApp, uint8 mode, bool apply) const;
266 void HandleAuraModMaxPowerPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
267 void HandleTriggerSpellOnHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
268 // fight
269 void HandleAuraModParryPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
270 void HandleAuraModDodgePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
271 void HandleAuraModBlockPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
272 void HandleAuraModRegenInterrupt(AuraApplication const* aurApp, uint8 mode, bool apply) const;
273 void HandleAuraModWeaponCritPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
274 void HandleModSpellHitChance(AuraApplication const* aurApp, uint8 mode, bool apply) const;
275 void HandleModSpellCritChance(AuraApplication const* aurApp, uint8 mode, bool apply) const;
276 void HandleAuraModCritPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
277 // attack speed
278 void HandleModCastingSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
279 void HandleModMeleeRangedSpeedPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
280 void HandleModCombatSpeedPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
281 void HandleModAttackSpeed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
282 void HandleModMeleeSpeedPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
283 void HandleAuraModRangedHaste(AuraApplication const* aurApp, uint8 mode, bool apply) const;
284 // combat rating
285 void HandleModRating(AuraApplication const* aurApp, uint8 mode, bool apply) const;
286 void HandleModRatingPct(AuraApplication const* aurApp, uint8 mode, bool apply) const;
287 // attack power
288 void HandleAuraModAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
289 void HandleAuraModRangedAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
290 void HandleAuraModAttackPowerPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
291 void HandleAuraModRangedAttackPowerPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
292 // damage bonus
293 void HandleModDamageDone(AuraApplication const* aurApp, uint8 mode, bool apply) const;
294 void HandleModDamagePercentDone(AuraApplication const* aurApp, uint8 mode, bool apply) const;
295 void HandleModOffhandDamagePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
296 void HandleShieldBlockValue(AuraApplication const* aurApp, uint8 mode, bool apply) const;
297 void HandleShieldBlockValuePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
298 // power cost
299 void HandleModPowerCost(AuraApplication const* aurApp, uint8 mode, bool apply) const;
300 void HandleArenaPreparation(AuraApplication const* aurApp, uint8 mode, bool apply) const;
301 void HandleNoReagentUseAura(AuraApplication const* aurApp, uint8 mode, bool apply) const;
302 // others
303 void HandleAuraDummy(AuraApplication const* aurApp, uint8 mode, bool apply) const;
304 void HandleChannelDeathItem(AuraApplication const* aurApp, uint8 mode, bool apply) const;
305 void HandleBindSight(AuraApplication const* aurApp, uint8 mode, bool apply) const;
306 void HandleForceReaction(AuraApplication const* aurApp, uint8 mode, bool apply) const;
307 void HandleAuraEmpathy(AuraApplication const* aurApp, uint8 mode, bool apply) const;
308 void HandleAuraModFaction(AuraApplication const* aurApp, uint8 mode, bool apply) const;
309 void HandleLearnSpell(AuraApplication const* aurApp, uint8 mode, bool apply) const;
310 void HandleComprehendLanguage(AuraApplication const* aurApp, uint8 mode, bool apply) const;
311 void HandleModAlternativeDefaultLanguage(AuraApplication const* aurApp, uint8 mode, bool apply) const;
312 void HandleAuraLinked(AuraApplication const* aurApp, uint8 mode, bool apply) const;
313 void HandleAuraOpenStable(AuraApplication const* aurApp, uint8 mode, bool apply) const;
314 void HandleAuraModFakeInebriation(AuraApplication const* aurApp, uint8 mode, bool apply) const;
315 void HandleAuraOverrideSpells(AuraApplication const* aurApp, uint8 mode, bool apply) const;
316 void HandleAuraSetVehicle(AuraApplication const* aurApp, uint8 mode, bool apply) const;
317 void HandleSetVignette(AuraApplication const* aurApp, uint8 mode, bool apply) const;
318 void HandlePreventResurrection(AuraApplication const* aurApp, uint8 mode, bool apply) const;
319 void HandleMastery(AuraApplication const* aurApp, uint8 mode, bool apply) const;
320 void HandleAuraForceWeather(AuraApplication const* aurApp, uint8 mode, bool apply) const;
321 void HandleEnableAltPower(AuraApplication const* aurApp, uint8 mode, bool apply) const;
322 void HandleModSpellCategoryCooldown(AuraApplication const* aurApp, uint8 mode, bool apply) const;
323 void HandleShowConfirmationPrompt(AuraApplication const* aurApp, uint8 mode, bool apply) const;
324 void HandleOverridePetSpecs(AuraApplication const* aurApp, uint8 mode, bool apply) const;
325 void HandleAllowUsingGameobjectsWhileMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const;
326 void HandlePlayScene(AuraApplication const* aurApp, uint8 mode, bool apply) const;
327 void HandleCreateAreaTrigger(AuraApplication const* aurApp, uint8 mode, bool apply) const;
328 void HandleLinkedSummon(AuraApplication const* aurApp, uint8 mode, bool apply) const;
329 void HandleSetFFAPvP(AuraApplication const* aurApp, uint8 mode, bool apply) const;
330 void HandleModOverrideZonePVPType(AuraApplication const* aurApp, uint8 mode, bool apply) const;
331 void HandleBattlegroundPlayerPosition(AuraApplication const* aurApp, uint8 mode, bool apply) const;
332 void HandleTriggerSpellOnPowerAmount(AuraApplication const* aurApp, uint8 mode, bool apply) const;
333 void HandleTriggerSpellOnPowerPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const;
334 void HandleTriggerSpellOnExpire(AuraApplication const* aurApp, uint8 mode, bool apply) const;
335 void HandleStoreTeleportReturnPoint(AuraApplication const* aurApp, uint8 mode, bool apply) const;
336 void HandleMountRestrictions(AuraApplication const* aurApp, uint8 mode, bool apply) const;
337 void HandleCosmeticMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const;
338 void HandleModRequiredMountCapabilityFlags(AuraApplication const* aurApp, uint8 mode, bool apply) const;
339 void HandleSuppressItemPassiveEffectBySpellLabel(AuraApplication const* aurApp, uint8 mode, bool apply) const;
340 void HandleForceBreathBar(AuraApplication const* aurApp, uint8 mode, bool apply) const;
341
342 // aura effect periodic tick handlers
343 void HandlePeriodicTriggerSpellAuraTick(Unit* target, Unit* caster) const;
344 void HandlePeriodicTriggerSpellWithValueAuraTick(Unit* target, Unit* caster) const;
345 void HandlePeriodicDamageAurasTick(Unit* target, Unit* caster) const;
346 void HandlePeriodicHealthLeechAuraTick(Unit* target, Unit* caster) const;
347 void HandlePeriodicHealthFunnelAuraTick(Unit* target, Unit* caster) const;
348 void HandlePeriodicHealAurasTick(Unit* target, Unit* caster) const;
349 void HandlePeriodicManaLeechAuraTick(Unit* target, Unit* caster) const;
350 void HandleObsModPowerAuraTick(Unit* target, Unit* caster) const;
351 void HandlePeriodicEnergizeAuraTick(Unit* target, Unit* caster) const;
352 void HandlePeriodicPowerBurnAuraTick(Unit* target, Unit* caster) const;
353
354 bool CanPeriodicTickCrit() const;
355 float CalcPeriodicCritChance(Unit const* caster) const;
356
357 // aura effect proc handlers
358 void HandleBreakableCCAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
359 void HandleProcTriggerSpellAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
360 void HandleProcTriggerSpellWithValueAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
361 void HandleProcTriggerDamageAuraProc(AuraApplication* aurApp, ProcEventInfo& eventInfo);
362
363 // pvp talents
364 void HandleAuraPvpTalents(AuraApplication const* auraApp, uint8 mode, bool apply) const;
365};
366
367namespace Trinity
368{
369 // Binary predicate for sorting the priority of absorption aura effects
371 {
372 public:
374 bool operator() (AuraEffect* aurEffA, AuraEffect* aurEffB) const
375 {
376 SpellInfo const* spellProtoA = aurEffA->GetSpellInfo();
377 SpellInfo const* spellProtoB = aurEffB->GetSpellInfo();
378
379 // Fel Blossom
380 if (spellProtoA->Id == 28527)
381 return true;
382 if (spellProtoB->Id == 28527)
383 return false;
384
385 // Ice Barrier
386 if (spellProtoA->GetCategory() == 471)
387 return true;
388 if (spellProtoB->GetCategory() == 471)
389 return false;
390
391 // Sacrifice
392 if (spellProtoA->Id == 7812)
393 return true;
394 if (spellProtoB->Id == 7812)
395 return false;
396
397 // Cauterize (must be last)
398 if (spellProtoA->Id == 86949)
399 return false;
400 if (spellProtoB->Id == 86949)
401 return true;
402
403 // Spirit of Redemption (must be last)
404 if (spellProtoA->Id == 20711)
405 return false;
406 if (spellProtoB->Id == 20711)
407 return true;
408
409 return false;
410 }
411 };
412}
413#endif
#define TC_GAME_API
Definition: Define.h:123
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
SpellEffIndex
Definition: SharedDefines.h:29
SpellEffectName
AuraType
void(AuraEffect::* pAuraEffectHandler)(AuraApplication const *aurApp, uint8 mode, bool apply) const
uint32 GetTickNumber() const
SpellInfo const * GetSpellInfo() const
AuraType GetAuraType() const
SpellEffIndex GetEffIndex() const
void HandleNULL(AuraApplication const *, uint8, bool) const
bool CanBeRecalculated() const
SpellModifier * m_spellmod
SpellEffectInfo const & GetSpellEffectInfo() const
void RecalculateAmount(Unit *caster, AuraEffect const *triggeredBy=nullptr)
bool m_canBeRecalculated
void HandleUnused(AuraApplication const *, uint8, bool) const
void HandleNoImmediateEffect(AuraApplication const *, uint8, bool) const
Optional< float > _estimatedAmount
uint32 GetRemainingTicks() const
uint32 GetId() const
int32 GetPeriodicTimer() const
int32 GetPeriod() const
bool IsPeriodic() const
int32 GetMiscValueB() const
void SetPeriodic(bool isPeriodic)
bool IsEffect(SpellEffectName effectName) const
void SetAmount(int32 amount)
Unit * GetCaster() const
int32 GetMiscValue() const
SpellEffectInfo const & m_effectInfo
int32 _periodicTimer
Aura * GetBase() const
int32 const m_baseAmount
void SetPeriodicTimer(int32 periodicTimer)
bool HasSpellClassMask() const
SpellInfo const *const m_spellInfo
int32 GetBaseAmount() const
void RecalculateAmount(AuraEffect const *triggeredBy=nullptr)
ObjectGuid GetCasterGUID() const
Optional< float > GetEstimatedAmount() const
bool IsEffect() const
void SetCanBeRecalculated(bool val)
void ResetTicks()
int32 GetAmount() const
Aura *const m_base
void _InitEffects(uint32 effMask, Unit *caster, int32 const *baseAmount)
Definition: SpellAuras.cpp:487
virtual ~Aura()
Definition: SpellAuras.cpp:497
uint32 GetCategory() const
Definition: SpellInfo.cpp:1386
uint32 const Id
Definition: SpellInfo.h:325
bool operator()(AuraEffect *aurEffA, AuraEffect *aurEffB) const
Definition: Unit.h:627
void apply(T *val)
Definition: ByteConverter.h:41
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:90