2 * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 #ifndef MANGOS_SPELLAURAS_H
19 #define MANGOS_SPELLAURAS_H
21 #include "SpellAuraDefines.h"
34 struct ProcTriggerSpell
;
39 typedef void(Aura::*pAuraHandler
)(bool Apply
, bool Real
);
40 // Real == true at aura add/remove
41 // Real == false at aura mod unapply/reapply; when adding/removing dependent aura/item/stat mods
43 // Code in aura handler can be guarded by if(Real) check if it should execution only at real add/remove of aura
45 // MAIN RULE: Code MUST NOT be guarded by if(Real) check if it modifies any stats
46 // (percent auras, stats mods, etc)
47 // Second rule: Code must be guarded by if(Real) check if it modifies object state (start/stop attack, send packets to client, etc)
49 // Other case choice: each code line moved under if(Real) check is mangos speedup,
50 // each setting object update field code line moved under if(Real) check is significant mangos speedup, and less server->client data sends
51 // each packet sending code moved under if(Real) check is _large_ mangos speedup, and lot less server->client data sends
53 class MANGOS_DLL_SPEC Aura
55 friend Aura
* CreateAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
, Item
* castItem
);
59 void HandleNULL(bool, bool)
63 void HandleUnused(bool, bool)
65 // NOT USED BY ANY SPELL OR USELESS
67 void HandleNoImmediateEffect(bool, bool)
69 // aura not have immediate effect at add/remove and handled by ID in other code place
71 void HandleBindSight(bool Apply
, bool Real
);
72 void HandleModPossess(bool Apply
, bool Real
);
73 void HandlePeriodicDamage(bool Apply
, bool Real
);
74 void HandleAuraDummy(bool Apply
, bool Real
);
75 void HandleAuraPeriodicDummy(bool apply
, bool Real
);
76 void HandleModConfuse(bool Apply
, bool Real
);
77 void HandleModCharm(bool Apply
, bool Real
);
78 void HandleModFear(bool Apply
, bool Real
);
79 void HandlePeriodicHeal(bool Apply
, bool Real
);
80 void HandleModAttackSpeed(bool Apply
, bool Real
);
81 void HandleModMeleeRangedSpeedPct(bool apply
, bool Real
);
82 void HandleModCombatSpeedPct(bool apply
, bool Real
);
83 void HandleModThreat(bool Apply
, bool Real
);
84 void HandleModTaunt(bool Apply
, bool Real
);
85 void HandleFeignDeath(bool Apply
, bool Real
);
86 void HandleAuraModDisarm(bool Apply
, bool Real
);
87 void HandleAuraModStalked(bool Apply
, bool Real
);
88 void HandleAuraWaterWalk(bool Apply
, bool Real
);
89 void HandleAuraFeatherFall(bool Apply
, bool Real
);
90 void HandleAuraHover(bool Apply
, bool Real
);
91 void HandleAddModifier(bool Apply
, bool Real
);
92 void HandleAddTargetTrigger(bool Apply
, bool Real
);
93 void HandleAuraModStun(bool Apply
, bool Real
);
94 void HandleModDamageDone(bool Apply
, bool Real
);
95 void HandleAuraUntrackable(bool Apply
, bool Real
);
96 void HandleAuraEmpathy(bool Apply
, bool Real
);
97 void HandleModOffhandDamagePercent(bool apply
, bool Real
);
98 void HandleAuraModRangedAttackPower(bool Apply
, bool Real
);
99 void HandleAuraModIncreaseEnergyPercent(bool Apply
, bool Real
);
100 void HandleAuraModIncreaseHealthPercent(bool Apply
, bool Real
);
101 void HandleAuraModRegenInterrupt(bool Apply
, bool Real
);
102 void HandleHaste(bool Apply
, bool Real
);
103 void HandlePeriodicTriggerSpell(bool Apply
, bool Real
);
104 void HandlePeriodicTriggerSpellWithValue(bool apply
, bool Real
);
105 void HandlePeriodicEnergize(bool Apply
, bool Real
);
106 void HandleAuraModResistanceExclusive(bool Apply
, bool Real
);
107 void HandleAuraSafeFall(bool Apply
, bool Real
);
108 void HandleAuraModPetTalentsPoints(bool Apply
, bool Real
);
109 void HandleModStealth(bool Apply
, bool Real
);
110 void HandleInvisibility(bool Apply
, bool Real
);
111 void HandleInvisibilityDetect(bool Apply
, bool Real
);
112 void HandleAuraModTotalHealthPercentRegen(bool Apply
, bool Real
);
113 void HandleAuraModTotalManaPercentRegen(bool Apply
, bool Real
);
114 void HandleAuraModResistance(bool Apply
, bool Real
);
115 void HandleAuraModRoot(bool Apply
, bool Real
);
116 void HandleAuraModSilence(bool Apply
, bool Real
);
117 void HandleAuraModStat(bool Apply
, bool Real
);
118 void HandleAuraModIncreaseSpeed(bool Apply
, bool Real
);
119 void HandleAuraModIncreaseMountedSpeed(bool Apply
, bool Real
);
120 void HandleAuraModIncreaseFlightSpeed(bool Apply
, bool Real
);
121 void HandleAuraModDecreaseSpeed(bool Apply
, bool Real
);
122 void HandleAuraModUseNormalSpeed(bool Apply
, bool Real
);
123 void HandleAuraModIncreaseHealth(bool Apply
, bool Real
);
124 void HandleAuraModIncreaseEnergy(bool Apply
, bool Real
);
125 void HandleAuraModShapeshift(bool Apply
, bool Real
);
126 void HandleAuraModEffectImmunity(bool Apply
, bool Real
);
127 void HandleAuraModStateImmunity(bool Apply
, bool Real
);
128 void HandleAuraModSchoolImmunity(bool Apply
, bool Real
);
129 void HandleAuraModDmgImmunity(bool Apply
, bool Real
);
130 void HandleAuraModDispelImmunity(bool Apply
, bool Real
);
131 void HandleAuraProcTriggerSpell(bool Apply
, bool Real
);
132 void HandleAuraTrackCreatures(bool Apply
, bool Real
);
133 void HandleAuraTrackResources(bool Apply
, bool Real
);
134 void HandleAuraModParryPercent(bool Apply
, bool Real
);
135 void HandleAuraModDodgePercent(bool Apply
, bool Real
);
136 void HandleAuraModBlockPercent(bool Apply
, bool Real
);
137 void HandleAuraModCritPercent(bool Apply
, bool Real
);
138 void HandlePeriodicLeech(bool Apply
, bool Real
);
139 void HandleModHitChance(bool Apply
, bool Real
);
140 void HandleModSpellHitChance(bool Apply
, bool Real
);
141 void HandleAuraModScale(bool Apply
, bool Real
);
142 void HandlePeriodicManaLeech(bool Apply
, bool Real
);
143 void HandlePeriodicHealthFunnel(bool apply
, bool Real
);
144 void HandleModCastingSpeed(bool Apply
, bool Real
);
145 void HandleAuraMounted(bool Apply
, bool Real
);
146 void HandleWaterBreathing(bool Apply
, bool Real
);
147 void HandleModBaseResistance(bool Apply
, bool Real
);
148 void HandleModRegen(bool Apply
, bool Real
);
149 void HandleModPowerRegen(bool Apply
, bool Real
);
150 void HandleModPowerRegenPCT(bool Apply
, bool Real
);
151 void HandleChannelDeathItem(bool Apply
, bool Real
);
152 void HandlePeriodicDamagePCT(bool Apply
, bool Real
);
153 void HandleAuraModAttackPower(bool Apply
, bool Real
);
154 void HandleAuraTransform(bool Apply
, bool Real
);
155 void HandleModSpellCritChance(bool Apply
, bool Real
);
156 void HandleAuraModIncreaseSwimSpeed(bool Apply
, bool Real
);
157 void HandleModPowerCostPCT(bool Apply
, bool Real
);
158 void HandleModPowerCost(bool Apply
, bool Real
);
159 void HandleFarSight(bool Apply
, bool Real
);
160 void HandleModPossessPet(bool Apply
, bool Real
);
161 void HandleModMechanicImmunity(bool Apply
, bool Real
);
162 void HandleModMechanicImmunityMask(bool Apply
, bool Real
);
163 void HandleAuraModSkill(bool Apply
, bool Real
);
164 void HandleModDamagePercentDone(bool Apply
, bool Real
);
165 void HandleModPercentStat(bool Apply
, bool Real
);
166 void HandleModResistancePercent(bool Apply
, bool Real
);
167 void HandleAuraModBaseResistancePCT(bool Apply
, bool Real
);
168 void HandleModShieldBlockPCT(bool Apply
, bool Real
);
169 void HandleAuraTrackStealthed(bool Apply
, bool Real
);
170 void HandleModShieldBlock(bool Apply
, bool Real
);
171 void HandleForceReaction(bool Apply
, bool Real
);
172 void HandleAuraModRangedHaste(bool Apply
, bool Real
);
173 void HandleRangedAmmoHaste(bool Apply
, bool Real
);
174 void HandleModHealingDone(bool Apply
, bool Real
);
175 void HandleModTotalPercentStat(bool Apply
, bool Real
);
176 void HandleAuraModTotalThreat(bool Apply
, bool Real
);
177 void HandleModUnattackable(bool Apply
, bool Real
);
178 void HandleAuraModPacify(bool Apply
, bool Real
);
179 void HandleAuraGhost(bool Apply
, bool Real
);
180 void HandleAuraAllowFlight(bool Apply
, bool Real
);
181 void HandleModRating(bool apply
, bool Real
);
182 void HandleModRatingFromStat(bool apply
, bool Real
);
183 void HandleModTargetResistance(bool apply
, bool Real
);
184 void HandleAuraModAttackPowerPercent(bool apply
, bool Real
);
185 void HandleAuraModRangedAttackPowerPercent(bool apply
, bool Real
);
186 void HandleAuraModRangedAttackPowerOfStatPercent(bool apply
, bool Real
);
187 void HandleAuraModAttackPowerOfStatPercent(bool apply
, bool Real
);
188 void HandleAuraModAttackPowerOfArmor(bool apply
, bool Real
);
189 void HandleSpiritOfRedemption(bool apply
, bool Real
);
190 void HandleModManaRegen(bool apply
, bool Real
);
191 void HandleComprehendLanguage(bool apply
, bool Real
);
192 void HandleShieldBlockValue(bool apply
, bool Real
);
193 void HandleModSpellCritChanceShool(bool apply
, bool Real
);
194 void HandleAuraRetainComboPoints(bool apply
, bool Real
);
195 void HandleModSpellDamagePercentFromStat(bool apply
, bool Real
);
196 void HandleModSpellHealingPercentFromStat(bool apply
, bool Real
);
197 void HandleAuraModDispelResist(bool apply
, bool Real
);
198 void HandleAuraControlVehicle(bool apply
, bool Real
);
199 void HandleModSpellDamagePercentFromAttackPower(bool apply
, bool Real
);
200 void HandleModSpellHealingPercentFromAttackPower(bool apply
, bool Real
);
201 void HandleAuraModPacifyAndSilence(bool Apply
, bool Real
);
202 void HandleAuraModIncreaseMaxHealth(bool apply
, bool Real
);
203 void HandleAuraModExpertise(bool apply
, bool Real
);
204 void HandleForceMoveForward(bool apply
, bool Real
);
205 void HandleAuraModResistenceOfStatPercent(bool apply
, bool Real
);
206 void HandleAuraPowerBurn(bool apply
, bool Real
);
207 void HandleSchoolAbsorb(bool apply
, bool Real
);
208 void HandlePreventFleeing(bool apply
, bool Real
);
209 void HandleManaShield(bool apply
, bool Real
);
210 void HandleArenaPreparation(bool apply
, bool Real
);
211 void HandleAuraConvertRune(bool apply
, bool Real
);
212 void HandleAuraIncreaseBaseHealthPercent(bool Apply
, bool Real
);
213 void HandleNoReagentUseAura(bool Apply
, bool Real
);
214 void HandlePhase(bool Apply
, bool Real
);
215 void HandleModTargetArmorPct(bool Apply
, bool Real
);
216 void HandleAuraModAllCritChance(bool Apply
, bool Real
);
217 void HandleAllowOnlyAbility(bool Apply
, bool Real
);
221 void SetModifier(AuraType t
, int32 a
, uint32 pt
, int32 miscValue
);
222 Modifier
* GetModifier() { return &m_modifier
; }
223 Modifier
const* GetModifier() const { return &m_modifier
; }
224 int32
GetMiscValue() const { return m_spellProto
->EffectMiscValue
[m_effIndex
]; }
225 int32
GetMiscBValue() const { return m_spellProto
->EffectMiscValueB
[m_effIndex
]; }
227 SpellEntry
const* GetSpellProto() const { return m_spellProto
; }
228 uint32
GetId() const{ return m_spellProto
->Id
; }
229 uint64
GetCastItemGUID() const { return m_castItemGuid
; }
230 uint32
GetEffIndex() const{ return m_effIndex
; }
231 int32
GetBasePoints() const { return m_currentBasePoints
; }
233 int32
GetAuraMaxDuration() const { return m_maxduration
; }
234 void SetAuraMaxDuration(int32 duration
) { m_maxduration
= duration
; }
235 int32
GetAuraDuration() const { return m_duration
; }
236 void SetAuraDuration(int32 duration
) { m_duration
= duration
; }
237 time_t GetAuraApplyTime() { return m_applyTime
; }
239 SpellModifier
*getAuraSpellMod() {return m_spellmod
; }
241 uint64
const& GetCasterGUID() const { return m_caster_guid
; }
242 Unit
* GetCaster() const;
243 Unit
* GetTarget() const { return m_target
; }
244 void SetTarget(Unit
* target
) { m_target
= target
; }
245 void SetLoadedState(uint64 caster_guid
,int32 damage
,int32 maxduration
,int32 duration
,int32 charges
)
247 m_caster_guid
= caster_guid
;
248 m_modifier
.m_amount
= damage
;
249 m_maxduration
= maxduration
;
250 m_duration
= duration
;
251 m_procCharges
= charges
;
254 uint8
GetAuraSlot() const { return m_auraSlot
; }
255 void SetAuraSlot(uint8 slot
) { m_auraSlot
= slot
; }
256 uint8
GetAuraFlags() const { return m_auraFlags
; }
257 void SetAuraFlags(uint8 flags
) { m_auraFlags
= flags
; }
258 uint8
GetAuraLevel() const { return m_auraLevel
; }
259 void SetAuraLevel(uint8 level
) { m_auraLevel
= level
; }
260 uint8
GetAuraCharges() const { return m_procCharges
; }
261 void SetAuraCharges(uint8 charges
)
263 if (m_procCharges
== charges
)
265 m_procCharges
= charges
;
266 SendAuraUpdate(false);
268 bool DropAuraCharge() // return true if last charge dropped
270 if (m_procCharges
== 0)
273 // exist spells that have maxStack > 1 and m_procCharges > 0 (==1 in fact)
274 // all like stacks have 1 value in one from this fields
275 // so return true for allow remove one aura from stacks as expired
276 if (GetStackAmount() > 1)
280 SendAuraUpdate(false);
281 return m_procCharges
== 0;
284 void UnregisterSingleCastAura();
286 void SetAura(bool remove
) { m_target
->SetVisibleAura(m_auraSlot
, remove
? 0 : GetId()); }
287 void SendAuraUpdate(bool remove
);
289 int8
GetStackAmount() {return m_stackAmount
;}
290 void SetStackAmount(uint8 num
);
291 bool modStackAmount(int32 num
); // return true if last charge dropped
294 bool IsPositive() { return m_positive
; }
295 void SetNegative() { m_positive
= false; }
296 void SetPositive() { m_positive
= true; }
298 bool IsPermanent() const { return m_permanent
; }
299 bool IsAreaAura() const { return m_isAreaAura
; }
300 bool IsPeriodic() const { return m_isPeriodic
; }
301 bool IsPassive() const { return m_isPassive
; }
302 bool IsPersistent() const { return m_isPersistent
; }
303 bool IsDeathPersistent() const { return m_isDeathPersist
; }
304 bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost
; }
305 bool IsInUse() const { return m_in_use
;}
306 bool IsDeleted() const { return m_deleted
;}
308 void SetInUse(bool state
)
318 void ApplyModifier(bool apply
, bool Real
= false);
320 void UpdateAura(uint32 diff
) { SetInUse(true); Update(diff
); SetInUse(false); }
324 bool IsSingleTarget() {return m_isSingleTargetAura
;}
325 void SetIsSingleTarget(bool val
) { m_isSingleTargetAura
= val
;}
327 void SetRemoveMode(AuraRemoveMode mode
) { m_removeMode
= mode
; }
329 virtual Unit
* GetTriggerTarget() const { return m_target
; }
331 // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
332 void HandleShapeshiftBoosts(bool apply
);
333 void HandleSpellSpecificBoosts(bool apply
);
335 // Allow Apply Aura Handler to modify and access m_AuraDRGroup
336 void setDiminishGroup(DiminishingGroup group
) { m_AuraDRGroup
= group
; }
337 DiminishingGroup
getDiminishGroup() const { return m_AuraDRGroup
; }
340 void TriggerSpellWithValue();
342 uint32
const *getAuraSpellClassMask() const { return m_spellProto
->EffectSpellClassMaskA
+ m_effIndex
* 3; }
343 bool isAffectedOnSpell(SpellEntry
const *spell
) const;
345 Aura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
= NULL
, Item
* castItem
= NULL
);
347 // must be called only from Aura::UpdateAura
348 virtual void Update(uint32 diff
);
350 // must be called only from Aura*::Update
352 void PeriodicDummyTick();
354 bool IsCritFromAbilityAura(Unit
* caster
, uint32
& damage
);
355 void ReapplyAffectedPassiveAuras(Unit
* target
, bool owner_mode
);
358 SpellModifier
*m_spellmod
;
360 SpellEntry
const *m_spellProto
;
362 uint64 m_caster_guid
;
363 uint64 m_castItemGuid
; // it is NOT safe to keep a pointer to the item because it may get deleted
366 int32 m_currentBasePoints
; // cache SpellEntry::EffectBasePoints and use for set custom base points
367 int32 m_maxduration
; // Max aura duration
368 int32 m_duration
; // Current time
369 int32 m_timeCla
; // Timer for power per sec calcultion
370 int32 m_periodicTimer
; // Timer for periodic auras
372 AuraRemoveMode m_removeMode
:8; // Store info for know remove aura reason
373 DiminishingGroup m_AuraDRGroup
:8; // Diminishing
375 uint8 m_effIndex
; // Aura effect index in spell
376 uint8 m_auraSlot
; // Aura slot on unit (for show in client)
377 uint8 m_auraFlags
; // Aura info flag (for send data to client)
378 uint8 m_auraLevel
; // Aura level (store caster level for correct show level dep amount)
379 uint8 m_procCharges
; // Aura charges (0 for infinite)
380 uint8 m_stackAmount
; // Aura stack amount
387 bool m_isPersistent
:1;
388 bool m_isDeathPersist
:1;
389 bool m_isRemovedOnShapeLost
:1;
390 bool m_deleted
:1; // true if RemoveAura(iterator) called while in Aura::ApplyModifier call (added to Unit::m_deletedAuras)
391 bool m_isSingleTargetAura
:1; // true if it's a single target spell and registered at caster - can change at spell steal for example
393 uint32 m_in_use
; // > 0 while in Aura::ApplyModifier call/Aura::Update/etc
395 void CleanupTriggeredSpells();
396 bool IsNeedVisibleSlot(Unit
const* caster
) const; // helper for check req. visibility slot
399 class MANGOS_DLL_SPEC AreaAura
: public Aura
402 AreaAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
= NULL
, Item
* castItem
= NULL
);
405 void Update(uint32 diff
);
408 AreaAuraType m_areaAuraType
;
411 class MANGOS_DLL_SPEC PersistentAreaAura
: public Aura
414 PersistentAreaAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
= NULL
, Item
* castItem
= NULL
);
415 ~PersistentAreaAura();
417 void Update(uint32 diff
);
420 class MANGOS_DLL_SPEC SingleEnemyTargetAura
: public Aura
422 friend Aura
* CreateAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
, Item
* castItem
);
425 ~SingleEnemyTargetAura();
426 Unit
* GetTriggerTarget() const;
429 SingleEnemyTargetAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
= NULL
, Item
* castItem
= NULL
);
430 uint64 m_casters_target_guid
;
433 Aura
* CreateAura(SpellEntry
const* spellproto
, uint32 eff
, int32
*currentBasePoints
, Unit
*target
, Unit
*caster
= NULL
, Item
* castItem
= NULL
);