[6922] Whitespace and newline fixes
[getmangos.git] / src / game / SpellAuras.h
blobea4f25ff430d7aaad68e528fee659afc10eba95f
1 /*
2 * Copyright (C) 2005-2008 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"
23 struct DamageManaShield
25 uint32 m_spellId;
26 uint32 m_modType;
27 int32 m_schoolType;
28 uint32 m_totalAbsorb;
29 uint32 m_currAbsorb;
32 struct Modifier
34 AuraType m_auraname;
35 int32 m_amount;
36 int32 m_miscvalue;
37 uint32 periodictime;
40 class Unit;
41 struct SpellEntry;
42 struct SpellModifier;
43 struct ProcTriggerSpell;
45 // forward decl
46 class Aura;
48 typedef void(Aura::*pAuraHandler)(bool Apply, bool Real);
49 // Real == true at aura add/remove
50 // Real == false at aura mod unapply/reapply; when adding/removing dependent aura/item/stat mods
52 // Code in aura handler can be guarded by if(Real) check if it should execution only at real add/remove of aura
54 // MAIN RULE: Code MUST NOT be guarded by if(Real) check if it modifies any stats
55 // (percent auras, stats mods, etc)
56 // Second rule: Code must be guarded by if(Real) check if it modifies object state (start/stop attack, send packets to client, etc)
58 // Other case choice: each code line moved under if(Real) check is mangos speedup,
59 // each setting object update field code line moved under if(Real) check is significant mangos speedup, and less server->client data sends
60 // each packet sending code moved under if(Real) check is _large_ mangos speedup, and lot less server->client data sends
62 class MANGOS_DLL_SPEC Aura
64 friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
66 public:
67 //aura handlers
68 void HandleNULL(bool, bool)
70 // NOT IMPLEMENTED
72 void HandleUnused(bool, bool)
74 // NOT USED BY ANY SPELL OR USELESS
76 void HandleNoImmediateEffect(bool, bool)
78 // aura not have immediate effect at add/remove and handled by ID in other code place
80 void HandleBindSight(bool Apply, bool Real);
81 void HandleModPossess(bool Apply, bool Real);
82 void HandlePeriodicDamage(bool Apply, bool Real);
83 void HandleAuraDummy(bool Apply, bool Real);
84 void HandleAuraPeriodicDummy(bool apply, bool Real);
85 void HandleModConfuse(bool Apply, bool Real);
86 void HandleModCharm(bool Apply, bool Real);
87 void HandleModFear(bool Apply, bool Real);
88 void HandlePeriodicHeal(bool Apply, bool Real);
89 void HandleModAttackSpeed(bool Apply, bool Real);
90 void HandleModMeleeRangedSpeedPct(bool apply, bool Real);
91 void HandleModCombatSpeedPct(bool apply, bool Real);
92 void HandleModThreat(bool Apply, bool Real);
93 void HandleModTaunt(bool Apply, bool Real);
94 void HandleFeignDeath(bool Apply, bool Real);
95 void HandleAuraModDisarm(bool Apply, bool Real);
96 void HandleAuraModStalked(bool Apply, bool Real);
97 void HandleAuraWaterWalk(bool Apply, bool Real);
98 void HandleAuraFeatherFall(bool Apply, bool Real);
99 void HandleAuraHover(bool Apply, bool Real);
100 void HandleAddModifier(bool Apply, bool Real);
101 void HandleAuraModStun(bool Apply, bool Real);
102 void HandleModDamageDone(bool Apply, bool Real);
103 void HandleAuraUntrackable(bool Apply, bool Real);
104 void HandleAuraEmpathy(bool Apply, bool Real);
105 void HandleModOffhandDamagePercent(bool apply, bool Real);
106 void HandleAuraModRangedAttackPower(bool Apply, bool Real);
107 void HandleAuraModIncreaseEnergyPercent(bool Apply, bool Real);
108 void HandleAuraModIncreaseHealthPercent(bool Apply, bool Real);
109 void HandleAuraModRegenInterrupt(bool Apply, bool Real);
110 void HandleHaste(bool Apply, bool Real);
111 void HandlePeriodicTriggerSpell(bool Apply, bool Real);
112 void HandlePeriodicEnergize(bool Apply, bool Real);
113 void HandleAuraModResistanceExclusive(bool Apply, bool Real);
114 void HandleModStealth(bool Apply, bool Real);
115 void HandleInvisibility(bool Apply, bool Real);
116 void HandleInvisibilityDetect(bool Apply, bool Real);
117 void HandleAuraModTotalHealthPercentRegen(bool Apply, bool Real);
118 void HandleAuraModTotalManaPercentRegen(bool Apply, bool Real);
119 void HandleAuraModResistance(bool Apply, bool Real);
120 void HandleAuraModRoot(bool Apply, bool Real);
121 void HandleAuraModSilence(bool Apply, bool Real);
122 void HandleAuraModStat(bool Apply, bool Real);
123 void HandleAuraModIncreaseSpeed(bool Apply, bool Real);
124 void HandleAuraModIncreaseMountedSpeed(bool Apply, bool Real);
125 void HandleAuraModIncreaseFlightSpeed(bool Apply, bool Real);
126 void HandleAuraModDecreaseSpeed(bool Apply, bool Real);
127 void HandleAuraModUseNormalSpeed(bool Apply, bool Real);
128 void HandleAuraModIncreaseHealth(bool Apply, bool Real);
129 void HandleAuraModIncreaseEnergy(bool Apply, bool Real);
130 void HandleAuraModShapeshift(bool Apply, bool Real);
131 void HandleAuraModEffectImmunity(bool Apply, bool Real);
132 void HandleAuraModStateImmunity(bool Apply, bool Real);
133 void HandleAuraModSchoolImmunity(bool Apply, bool Real);
134 void HandleAuraModDmgImmunity(bool Apply, bool Real);
135 void HandleAuraModDispelImmunity(bool Apply, bool Real);
136 void HandleAuraProcTriggerSpell(bool Apply, bool Real);
137 void HandleAuraTrackCreatures(bool Apply, bool Real);
138 void HandleAuraTrackResources(bool Apply, bool Real);
139 void HandleAuraModParryPercent(bool Apply, bool Real);
140 void HandleAuraModDodgePercent(bool Apply, bool Real);
141 void HandleAuraModBlockPercent(bool Apply, bool Real);
142 void HandleAuraModCritPercent(bool Apply, bool Real);
143 void HandlePeriodicLeech(bool Apply, bool Real);
144 void HandleModHitChance(bool Apply, bool Real);
145 void HandleModSpellHitChance(bool Apply, bool Real);
146 void HandleAuraModScale(bool Apply, bool Real);
147 void HandlePeriodicManaLeech(bool Apply, bool Real);
148 void HandleModCastingSpeed(bool Apply, bool Real);
149 void HandleAuraMounted(bool Apply, bool Real);
150 void HandleWaterBreathing(bool Apply, bool Real);
151 void HandleModBaseResistance(bool Apply, bool Real);
152 void HandleModRegen(bool Apply, bool Real);
153 void HandleModPowerRegen(bool Apply, bool Real);
154 void HandleModPowerRegenPCT(bool Apply, bool Real);
155 void HandleChannelDeathItem(bool Apply, bool Real);
156 void HandlePeriodicDamagePCT(bool Apply, bool Real);
157 void HandleAuraModAttackPower(bool Apply, bool Real);
158 void HandleAuraTransform(bool Apply, bool Real);
159 void HandleModSpellCritChance(bool Apply, bool Real);
160 void HandleAuraModIncreaseSwimSpeed(bool Apply, bool Real);
161 void HandleModPowerCostPCT(bool Apply, bool Real);
162 void HandleModPowerCost(bool Apply, bool Real);
163 void HandleFarSight(bool Apply, bool Real);
164 void HandleModPossessPet(bool Apply, bool Real);
165 void HandleModMechanicImmunity(bool Apply, bool Real);
166 void HandleAuraModSkill(bool Apply, bool Real);
167 void HandleModDamagePercentDone(bool Apply, bool Real);
168 void HandleModPercentStat(bool Apply, bool Real);
169 void HandleModResistancePercent(bool Apply, bool Real);
170 void HandleAuraModBaseResistancePCT(bool Apply, bool Real);
171 void HandleModShieldBlockPCT(bool Apply, bool Real);
172 void HandleAuraTrackStealthed(bool Apply, bool Real);
173 void HandleModShieldBlock(bool Apply, bool Real);
174 void HandleForceReaction(bool Apply, bool Real);
175 void HandleAuraModRangedHaste(bool Apply, bool Real);
176 void HandleRangedAmmoHaste(bool Apply, bool Real);
177 void HandleModHealingDone(bool Apply, bool Real);
178 void HandleModTotalPercentStat(bool Apply, bool Real);
179 void HandleAuraModTotalThreat(bool Apply, bool Real);
180 void HandleModUnattackable(bool Apply, bool Real);
181 void HandleAuraModPacify(bool Apply, bool Real);
182 void HandleAuraGhost(bool Apply, bool Real);
183 void HandleAuraAllowFlight(bool Apply, bool Real);
184 void HandleModRating(bool apply, bool Real);
185 void HandleModTargetResistance(bool apply, bool Real);
186 void HandleAuraModAttackPowerPercent(bool apply, bool Real);
187 void HandleAuraModRangedAttackPowerPercent(bool apply, bool Real);
188 void HandleAuraModRangedAttackPowerOfStatPercent(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 HandleModSpellDamagePercentFromAttackPower(bool apply, bool Real);
199 void HandleModSpellHealingPercentFromAttackPower(bool apply, bool Real);
200 void HandleAuraModPacifyAndSilence(bool Apply, bool Real);
201 void HandleAuraModIncreaseMaxHealth(bool apply, bool Real);
202 void HandleAuraModExpertise(bool apply, bool Real);
203 void HandleForceMoveForward(bool apply, bool Real);
204 void HandleAuraModResistenceOfStatPercent(bool apply, bool Real);
205 void HandleAuraPowerBurn(bool apply, bool Real);
206 void HandleSchoolAbsorb(bool apply, bool Real);
207 void HandlePreventFleeing(bool apply, bool Real);
208 void HandleManaShield(bool apply, bool Real);
209 void HandleArenaPreparation(bool apply, bool Real);
211 virtual ~Aura();
213 void SetModifier(AuraType t, int32 a, uint32 pt, int32 miscValue);
214 Modifier* GetModifier() {return &m_modifier;}
215 int32 GetMiscValue() {return m_spellProto->EffectMiscValue[m_effIndex];}
216 int32 GetMiscBValue() {return m_spellProto->EffectMiscValueB[m_effIndex];}
218 SpellEntry const* GetSpellProto() const { return m_spellProto; }
219 uint32 GetId() const{ return m_spellProto->Id; }
220 uint64 GetCastItemGUID() const { return m_castItemGuid; }
221 uint32 GetEffIndex() const{ return m_effIndex; }
222 int32 GetBasePoints() const { return m_currentBasePoints; }
224 int32 GetAuraMaxDuration() const { return m_maxduration; }
225 void SetAuraMaxDuration(int32 duration) { m_maxduration = duration; }
226 int32 GetAuraDuration() const { return m_duration; }
227 void SetAuraDuration(int32 duration) { m_duration = duration; }
228 time_t GetAuraApplyTime() { return m_applyTime; }
229 void UpdateAuraDuration();
230 void SendAuraDurationForCaster(Player* caster);
232 uint64 const& GetCasterGUID() const { return m_caster_guid; }
233 Unit* GetCaster() const;
234 Unit* GetTarget() const { return m_target; }
235 void SetTarget(Unit* target) { m_target = target; }
236 void SetLoadedState(uint64 caster_guid,int32 damage,int32 maxduration,int32 duration,int32 charges)
238 m_caster_guid = caster_guid;
239 m_modifier.m_amount = damage;
240 m_maxduration = maxduration;
241 m_duration = duration;
242 m_procCharges = charges;
245 uint8 GetAuraSlot() const { return m_auraSlot; }
246 void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }
247 void UpdateAuraCharges()
249 uint8 slot = GetAuraSlot();
251 // only aura in slot with charges and without stack limitation
252 if (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
253 SetAuraApplication(slot, m_procCharges - 1);
256 bool IsPositive() { return m_positive; }
257 void SetNegative() { m_positive = false; }
258 void SetPositive() { m_positive = true; }
260 bool IsPermanent() const { return m_permanent; }
261 bool IsAreaAura() const { return m_isAreaAura; }
262 bool IsPeriodic() const { return m_isPeriodic; }
263 bool IsTrigger() const { return m_isTrigger; }
264 bool IsPassive() const { return m_isPassive; }
265 bool IsPersistent() const { return m_isPersistent; }
266 bool IsDeathPersistent() const { return m_isDeathPersist; }
267 bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; }
268 bool IsInUse() const { return m_in_use;}
270 virtual void Update(uint32 diff);
271 void ApplyModifier(bool apply, bool Real = false);
273 void _AddAura();
274 void _RemoveAura();
276 void TriggerSpell();
278 bool IsUpdated() { return m_updated; }
279 void SetUpdated(bool val) { m_updated = val; }
280 void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
282 int32 m_procCharges;
284 virtual Unit* GetTriggerTarget() const { return m_target; }
286 // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
287 void HandleShapeshiftBoosts(bool apply);
289 // Allow Apply Aura Handler to modify and access m_AuraDRGroup
290 void setDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
291 DiminishingGroup getDiminishGroup() const { return m_AuraDRGroup; }
293 void PeriodicTick();
294 void PeriodicDummyTick();
295 protected:
296 Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
298 Modifier m_modifier;
299 SpellModifier *m_spellmod;
300 uint32 m_effIndex;
301 SpellEntry const *m_spellProto;
302 int32 m_currentBasePoints; // cache SpellEntry::EffectBasePoints and use for set custom base points
303 uint64 m_caster_guid;
304 Unit* m_target;
305 int32 m_maxduration;
306 int32 m_duration;
307 int32 m_timeCla;
308 uint64 m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
309 time_t m_applyTime;
311 AuraRemoveMode m_removeMode;
313 uint8 m_auraSlot;
315 bool m_positive:1;
316 bool m_permanent:1;
317 bool m_isPeriodic:1;
318 bool m_isTrigger:1;
319 bool m_isAreaAura:1;
320 bool m_isPassive:1;
321 bool m_isPersistent:1;
322 bool m_isDeathPersist:1;
323 bool m_isRemovedOnShapeLost:1;
324 bool m_updated:1;
325 bool m_in_use:1; // true while in Aura::ApplyModifier call
327 int32 m_periodicTimer;
328 uint32 m_PeriodicEventId;
329 DiminishingGroup m_AuraDRGroup;
330 private:
331 void UpdateSlotCounterAndDuration(bool add);
332 void CleanupTriggeredSpells();
333 void SetAura(uint32 slot, bool remove) { m_target->SetUInt32Value(UNIT_FIELD_AURA + slot, remove ? 0 : GetId()); }
334 void SetAuraFlag(uint32 slot, bool add);
335 void SetAuraLevel(uint32 slot, uint32 level);
336 void SetAuraApplication(uint32 slot, int8 count);
339 class MANGOS_DLL_SPEC AreaAura : public Aura
341 public:
342 AreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
343 ~AreaAura();
344 void Update(uint32 diff);
345 private:
346 float m_radius;
347 AreaAuraType m_areaAuraType;
350 class MANGOS_DLL_SPEC PersistentAreaAura : public Aura
352 public:
353 PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
354 ~PersistentAreaAura();
355 void Update(uint32 diff);
358 class MANGOS_DLL_SPEC SingleEnemyTargetAura : public Aura
360 friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
362 public:
363 ~SingleEnemyTargetAura();
364 Unit* GetTriggerTarget() const;
366 protected:
367 SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
368 uint64 m_casters_target_guid;
371 Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
372 #endif