root/trunk/src/game/SpellAuras.h @ 26

Revision 15, 17.1 kB (checked in by yumileroy, 17 years ago)

[svn] * Make Grounding totem disappear after any spell redirection
Patch provided by Albrecht de Endrau

Original author: Neo2003
Date: 2008-10-05 15:17:41-05:00

Line 
1/*
2 * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
3 *
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.
8 *
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.
13 *
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
17 */
18#ifndef MANGOS_SPELLAURAS_H
19#define MANGOS_SPELLAURAS_H
20
21#include "SpellAuraDefines.h"
22
23struct DamageManaShield
24{
25    uint32 m_spellId;
26    uint32 m_modType;
27    int32 m_schoolType;
28    uint32 m_totalAbsorb;
29    uint32 m_currAbsorb;
30};
31
32struct Modifier
33{
34    AuraType m_auraname;
35    int32 m_amount;
36    int32 m_miscvalue;
37    uint32 periodictime;
38};
39
40class Unit;
41struct SpellEntry;
42struct SpellModifier;
43struct ProcTriggerSpell;
44
45// forward decl
46class Aura;
47
48typedef 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
51//
52// Code in aura handler can be guarded by if(Real) check if it should execution only at real add/remove of aura
53//
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)
57//
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
61
62class MANGOS_DLL_SPEC Aura
63{
64    friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
65
66    public:
67        //aura handlers
68        void HandleNULL(bool, bool)
69        {
70            // NOT IMPLEMENTED
71        }
72        void HandleUnused(bool, bool)
73        {
74            // NOT USED BY ANY SPELL OR USELESS
75        }
76        void HandleNoImmediateEffect(bool, bool)
77        {
78            // aura not have immediate effect at add/remove and handled by ID in other code place
79        }
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 HandleAuraAttackPowerAttacker(bool apply, bool Real);
187        void HandleAuraModAttackPowerPercent(bool apply, bool Real);
188        void HandleAuraModRangedAttackPowerPercent(bool apply, bool Real);
189        void HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real);
190        void HandleSpiritOfRedemption(bool apply, bool Real);
191        void HandleAuraHealingPct(bool apply, bool Real);
192        void HandleModManaRegen(bool apply, bool Real);
193        void HandleComprehendLanguage(bool apply, bool Real);
194        void HandleAuraHealing(bool apply, bool Real);
195        void HandleShieldBlockValue(bool apply, bool Real);
196        void HandleModSpellCritChanceShool(bool apply, bool Real);
197        void HandleAuraRetainComboPoints(bool apply, bool Real);
198        void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
199        void HandleModSpellHealingPercentFromStat(bool apply, bool Real);
200        void HandleAuraModDispelResist(bool apply, bool Real);
201        void HandleModSpellDamagePercentFromAttackPower(bool apply, bool Real);
202        void HandleModSpellHealingPercentFromAttackPower(bool apply, bool Real);
203        void HandleAuraModPacifyAndSilence(bool Apply, bool Real);
204        void HandleAuraModIncreaseMaxHealth(bool apply, bool Real);
205        void HandleAuraModExpertise(bool apply, bool Real);
206        void HandleForceMoveForward(bool apply, bool Real);
207        void HandleAuraModResistenceOfStatPercent(bool apply, bool Real);
208        void HandleAuraPowerBurn(bool apply, bool Real);
209        void HandleSchoolAbsorb(bool apply, bool Real);
210        void HandlePreventFleeing(bool apply, bool Real);
211        void HandleManaShield(bool apply, bool Real);
212        void HandleArenaPreparation(bool apply, bool Real);
213
214        virtual ~Aura();
215
216        void SetModifier(AuraType t, int32 a, uint32 pt, int32 miscValue);
217        Modifier* GetModifier() {return &m_modifier;}
218        int32 GetMiscValue() {return m_spellProto->EffectMiscValue[m_effIndex];}
219        int32 GetMiscBValue() {return m_spellProto->EffectMiscValueB[m_effIndex];}
220
221        SpellEntry const* GetSpellProto() const { return m_spellProto; }
222        uint32 GetId() const{ return m_spellProto->Id; }
223        uint64 GetCastItemGUID() const { return m_castItemGuid; }
224        uint32 GetEffIndex() const{ return m_effIndex; }
225        int32 GetBasePoints() const { return m_currentBasePoints; }
226
227        int32 GetAuraMaxDuration() const { return m_maxduration; }
228        void SetAuraMaxDuration(int32 duration) { m_maxduration = duration; }
229        int32 GetAuraDuration() const { return m_duration; }
230        void SetAuraDuration(int32 duration) { m_duration = duration; }
231        time_t GetAuraApplyTime() { return m_applyTime; }
232        void UpdateAuraDuration();
233        void SendAuraDurationForCaster(Player* caster);
234
235        uint64 const& GetCasterGUID() const { return m_caster_guid; }
236        Unit* GetCaster() const;
237        Unit* GetTarget() const { return m_target; }
238        void SetTarget(Unit* target) { m_target = target; }
239        void SetLoadedState(uint64 caster_guid,int32 damage,int32 maxduration,int32 duration,int32 charges)
240        {
241            m_caster_guid = caster_guid;
242            m_modifier.m_amount = damage;
243            m_maxduration = maxduration;
244            m_duration = duration;
245            m_procCharges = charges;
246        }
247
248        uint8 GetAuraSlot() const { return m_auraSlot; }
249        void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }
250        void UpdateAuraCharges()
251        {
252            uint8 slot = GetAuraSlot();
253
254            // only aura inslot with charges and without stack limitation
255            if (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
256                SetAuraApplication(slot, m_procCharges - 1);
257        }
258
259        bool IsPositive() { return m_positive; }
260        void SetNegative() { m_positive = false; }
261        void SetPositive() { m_positive = true; }
262
263        bool IsPermanent() const { return m_permanent; }
264        bool IsAreaAura() const { return m_isAreaAura; }
265        bool IsPeriodic() const { return m_isPeriodic; }
266        bool IsTrigger() const { return m_isTrigger; }
267        bool IsPassive() const { return m_isPassive; }
268        bool IsPersistent() const { return m_isPersistent; }
269        bool IsDeathPersistent() const { return m_isDeathPersist; }
270        bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; }
271        bool IsInUse() const { return m_in_use;}
272
273        virtual void Update(uint32 diff);
274        void ApplyModifier(bool apply, bool Real = false);
275
276        void _AddAura();
277        void _RemoveAura();
278
279        void TriggerSpell();
280
281        bool IsUpdated() { return m_updated; }
282        void SetUpdated(bool val) { m_updated = val; }
283        void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
284
285        int32 m_procCharges;
286        void SetAuraProcCharges(int32 charges) { m_procCharges = charges; }
287
288        virtual Unit* GetTriggerTarget() const { return m_target; }
289
290        // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
291        void HandleShapeshiftBoosts(bool apply);
292
293        // Allow Apply Aura Handler to modify and access m_AuraDRGroup
294        void setDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
295        DiminishingGroup getDiminishGroup() const { return m_AuraDRGroup; }
296
297        void PeriodicTick();
298        void PeriodicDummyTick();
299    protected:
300        Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
301
302        Modifier m_modifier;
303        SpellModifier *m_spellmod;
304        uint32 m_effIndex;
305        SpellEntry const *m_spellProto;
306        int32 m_currentBasePoints;                          // cache SpellEntry::EffectBasePoints and use for set custom base points
307        uint64 m_caster_guid;
308        Unit* m_target;
309        int32 m_maxduration;
310        int32 m_duration;
311        int32 m_timeCla;
312        uint64 m_castItemGuid;                              // it is NOT safe to keep a pointer to the item because it may get deleted
313        time_t m_applyTime;
314
315        AuraRemoveMode m_removeMode;
316
317        uint8 m_auraSlot;
318
319        bool m_positive:1;
320        bool m_permanent:1;
321        bool m_isPeriodic:1;
322        bool m_isTrigger:1;
323        bool m_isAreaAura:1;
324        bool m_isPassive:1;
325        bool m_isPersistent:1;
326        bool m_isDeathPersist:1;
327        bool m_isRemovedOnShapeLost:1;
328        bool m_updated:1;
329        bool m_in_use:1;                                    // true while in Aura::ApplyModifier call
330
331        int32 m_periodicTimer;
332        uint32 m_PeriodicEventId;
333        DiminishingGroup m_AuraDRGroup;
334    private:
335        void UpdateSlotCounterAndDuration(bool add);
336        void CleanupTriggeredSpells();
337        void SetAura(uint32 slot, bool remove) { m_target->SetUInt32Value(UNIT_FIELD_AURA + slot, remove ? 0 : GetId()); }
338        void SetAuraFlag(uint32 slot, bool add);
339        void SetAuraLevel(uint32 slot, uint32 level);
340        void SetAuraApplication(uint32 slot, int8 count);
341};
342
343class MANGOS_DLL_SPEC AreaAura : public Aura
344{
345    public:
346        AreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
347        ~AreaAura();
348        void Update(uint32 diff);
349    private:
350        float m_radius;
351        AreaAuraType m_areaAuraType;
352};
353
354class MANGOS_DLL_SPEC PersistentAreaAura : public Aura
355{
356    public:
357        PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
358        ~PersistentAreaAura();
359        void Update(uint32 diff);
360};
361
362class MANGOS_DLL_SPEC SingleEnemyTargetAura : public Aura
363{
364    friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
365
366    public:
367        ~SingleEnemyTargetAura();
368        Unit* GetTriggerTarget() const;
369
370    protected:
371        SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster  = NULL, Item* castItem = NULL);
372        uint64 m_casters_target_guid;
373};
374
375Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
376#endif
Note: See TracBrowser for help on using the browser.