aboutsummaryrefslogtreecommitdiff
path: root/src/game/SpellAuraEffects.h
blob: a74952fef5224e3b8707eb7693f190a2f65983af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#ifndef TRINITY_SPELLAURAEFFECTS_H
#define TRINITY_SPELLAURAEFFECTS_H

class Unit;
class DynamicObject;
class AuraEffect;
class Aura;

#include "SpellAuras.h"

#define AURA_EFFECT_HANDLE_DEFAULT 0
#define AURA_EFFECT_HANDLE_REAL 0x01
#define AURA_EFFECT_HANDLE_SEND_FOR_CLIENT 0x02
#define AURA_EFFECT_HANDLE_CHANGE_AMOUNT 0x04
#define AURA_EFFECT_HANDLE_STAT 0x08
#define AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK (AURA_EFFECT_HANDLE_SEND_FOR_CLIENT | AURA_EFFECT_HANDLE_REAL)
#define AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK (AURA_EFFECT_HANDLE_CHANGE_AMOUNT | AURA_EFFECT_HANDLE_REAL)
#define AURA_EFFECT_HANDLE_CHANGE_AMOUNT_SEND_FOR_CLIENT_MASK  (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK)

typedef void(AuraEffect::*pAuraEffectHandler)(AuraApplication const * aurApp, uint8 mode, bool apply) const;

class TRINITY_DLL_SPEC AuraEffect
{
    friend Aura::Aura(SpellEntry const* spellproto, uint8 effMask, WorldObject * owner, Unit * caster, int32 *baseAmount, Item * castItem, uint64 casterGUID);
    friend Aura::~Aura();
    private:
        ~AuraEffect();
        explicit AuraEffect(Aura * base, uint8 effIndex, int32 *baseAmount, Unit * caster);
    public:
        Unit * GetCaster() const { return GetBase()->GetCaster(); }
        uint64 GetCasterGUID() const { return GetBase()->GetCasterGUID(); }
        Aura * GetBase() const { return m_base; }
        void GetTargetList(std::list<Unit*> & targetList) const;

        SpellEntry const * GetSpellProto() const { return m_spellProto; }
        uint32 GetId() const { return m_spellProto->Id; }
        uint32 GetEffIndex() const { return m_effIndex; }
        int32 GetBaseAmount() const { return m_baseAmount; }
        int32 GetAmplitude() const { return m_amplitude; }

        int32 GetMiscValueB() const { return m_spellProto->EffectMiscValueB[m_effIndex]; }
        int32 GetMiscValue() const { return m_spellProto->EffectMiscValue[m_effIndex]; }
        AuraType GetAuraType() const { return (AuraType)m_spellProto->EffectApplyAuraName[m_effIndex]; }
        int32 GetAmount() const { return m_amount; }
        void SetAmount(int32 amount) { m_amount = amount; m_canBeRecalculated = false;}

        int32 CalculateAmount(Unit * caster);
        void CalculatePeriodic(Unit * caster, bool create = false);
        void CalculateSpellMod();
        void ChangeAmount(int32 newAmount, bool mark = true);
        void RecalculateAmount() { if(!CanBeRecalculated()) return; ChangeAmount(CalculateAmount(GetCaster()), false); }
        void RecalculateAmount(Unit * caster) { if(!CanBeRecalculated()) return; ChangeAmount(CalculateAmount(caster), false); }
        bool CanBeRecalculated() const { return m_canBeRecalculated; }
        void SetCanBeRecalculated(bool val) { m_canBeRecalculated = val; }
        void HandleEffect(AuraApplication const * aurApp, uint8 mode, bool apply);
        void HandleEffect(Unit * target, uint8 mode, bool apply);
        void ApplySpellMod(Unit * target, bool apply);

        void Update(uint32 diff, Unit * caster);
        void UpdatePeriodic(Unit * caster);

        uint32 GetTickNumber() const { return m_tickNumber; }
        int32 GetTotalTicks() const { return m_amplitude ? (GetBase()->GetMaxDuration() / m_amplitude) : 1;}
        void ResetPeriodic() {m_periodicTimer = m_amplitude; m_tickNumber = 0;}

        bool IsPeriodic() const { return m_isPeriodic; }
        bool IsAffectedOnSpell(SpellEntry const *spell) const;

        void SendTickImmune(Unit * target, Unit *caster) const;

        void PeriodicTick(Unit * target, Unit * caster) const;
        void PeriodicDummyTick(Unit * target, Unit * caster) const;
        Unit* GetTriggerTarget(Unit * target) const;
        void TriggerSpell(Unit * target, Unit * caster) const;
        void TriggerSpellWithValue(Unit * target, Unit * caster) const;

        void CleanupTriggeredSpells(Unit * target);

        static bool IsPeriodicAuraType(uint32 type);
        // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
        void HandleShapeshiftBoosts(Unit * target, bool apply) const;
    private:
        Aura * const m_base;

        SpellEntry const * const m_spellProto;
        uint8 const m_effIndex;
        int32 const m_baseAmount;

        int32 m_amount;
        bool m_canBeRecalculated:1;

        SpellModifier *m_spellmod;

        bool m_isPeriodic:1;
        int32 m_periodicTimer;
        int32 m_amplitude;
        uint32 m_tickNumber;
    private:
        bool IsPeriodicTickCrit(Unit * target, Unit const * caster) const;

    public:
        // aura effect handlers
        void HandleNULL(AuraApplication const * aurApp, uint8 mode, bool apply) const
        {
            // not implemented
        }
        void HandleUnused(AuraApplication const * aurApp, uint8 mode, bool apply) const
        {
            // useless
        }
        void HandleNoImmediateEffect(AuraApplication const * aurApp, uint8 mode, bool apply) const
        {
            // aura type not have immediate effect at add/remove and handled by ID in other code place
        }
        //  visibility & phases
        void HandleInvisibilityDetect(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleInvisibility(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModStealth(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleSpiritOfRedemption(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraGhost(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandlePhase(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  unit model
        void HandleAuraModShapeshift(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraTransform(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModScale(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraCloneCaster(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  fight
        void HandleFeignDeath(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModUnattackable(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModDisarm(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModSilence(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModPacify(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModPacifyAndSilence(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraAllowOnlyAbility(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  tracking
        void HandleAuraTrackResources(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraTrackCreatures(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraTrackStealthed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModStalked(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraUntrackable(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  skills & talents
        void HandleAuraModPetTalentsPoints(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModSkill(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  movement
        void HandleAuraMounted(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraAllowFlight(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraWaterWalk(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraFeatherFall(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraHover(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleWaterBreathing(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleForceMoveForward(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  threat
        void HandleModThreat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModTotalThreat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModTaunt(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  control
        void HandleModConfuse(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModFear(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModStun(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRoot(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandlePreventFleeing(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  charm
        void HandleModPossess(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModPossessPet(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModCharm(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleCharmConvert(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraControlVehicle(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  modify speed
        void HandleAuraModIncreaseSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseMountedSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseFlightSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseSwimSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModDecreaseSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModUseNormalSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  immunity
        void HandleModStateImmunityMask(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModMechanicImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModEffectImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModStateImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModSchoolImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModDmgImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModDispelImmunity(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  modify stats
        //   resistance
        void HandleAuraModResistanceExclusive(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModResistance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModBaseResistancePCT(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModResistancePercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModBaseResistance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModTargetResistance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //    stat
        void HandleAuraModStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModPercentStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellDamagePercentFromStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellHealingPercentFromStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellDamagePercentFromAttackPower(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellHealingPercentFromAttackPower(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModHealingDone(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModTotalPercentStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModResistenceOfStatPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModExpertise(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   heal and energize
        void HandleModPowerRegen(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModPowerRegenPCT(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModManaRegen(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseHealth(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseMaxHealth(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseEnergy(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseEnergyPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModIncreaseHealthPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraIncreaseBaseHealthPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   fight
        void HandleAuraModParryPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModDodgePercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModBlockPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRegenInterrupt(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModWeaponCritPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModHitChance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellHitChance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellCritChance(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModSpellCritChanceShool(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModCritPct(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   attack speed
        void HandleModCastingSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModMeleeRangedSpeedPct(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModCombatSpeedPct(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModAttackSpeed(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleHaste(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRangedHaste(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleRangedAmmoHaste(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   combat rating
        void HandleModRating(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModRatingFromStat(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   attack power
        void HandleAuraModAttackPower(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRangedAttackPower(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModAttackPowerPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRangedAttackPowerPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModRangedAttackPowerOfStatPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModAttackPowerOfStatPercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModAttackPowerOfArmor(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //   damage bonus
        void HandleModDamageDone(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModDamagePercentDone(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModOffhandDamagePercent(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleShieldBlockValue(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  power cost
        void HandleModPowerCostPCT(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleModPowerCost(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleArenaPreparation(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleNoReagentUseAura(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraRetainComboPoints(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        //  others
        void HandleAuraDummy(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleChannelDeathItem(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleBindSight(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleForceReaction(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraEmpathy(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraModFaction(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleComprehendLanguage(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraConvertRune(AuraApplication const * aurApp, uint8 mode, bool apply) const;
        void HandleAuraLinked(AuraApplication const * aurApp, uint8 mode, bool apply) const;
};

#endif