aboutsummaryrefslogtreecommitdiff
path: root/src/game/SpellAuras.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/SpellAuras.h')
-rw-r--r--src/game/SpellAuras.h375
1 files changed, 375 insertions, 0 deletions
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
new file mode 100644
index 00000000000..24b94202978
--- /dev/null
+++ b/src/game/SpellAuras.h
@@ -0,0 +1,375 @@
+/*
+ * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#ifndef MANGOS_SPELLAURAS_H
+#define MANGOS_SPELLAURAS_H
+
+#include "SpellAuraDefines.h"
+
+struct DamageManaShield
+{
+ uint32 m_spellId;
+ uint32 m_modType;
+ int32 m_schoolType;
+ uint32 m_totalAbsorb;
+ uint32 m_currAbsorb;
+};
+
+struct Modifier
+{
+ AuraType m_auraname;
+ int32 m_amount;
+ int32 m_miscvalue;
+ uint32 periodictime;
+};
+
+class Unit;
+struct SpellEntry;
+struct SpellModifier;
+struct ProcTriggerSpell;
+
+// forward decl
+class Aura;
+
+typedef void(Aura::*pAuraHandler)(bool Apply, bool Real);
+// Real == true at aura add/remove
+// Real == false at aura mod unapply/reapply; when adding/removing dependent aura/item/stat mods
+//
+// Code in aura handler can be guarded by if(Real) check if it should execution only at real add/remove of aura
+//
+// MAIN RULE: Code MUST NOT be guarded by if(Real) check if it modifies any stats
+// (percent auras, stats mods, etc)
+// Second rule: Code must be guarded by if(Real) check if it modifies object state (start/stop attack, send packets to client, etc)
+//
+// Other case choice: each code line moved under if(Real) check is mangos speedup,
+// each setting object update field code line moved under if(Real) check is significant mangos speedup, and less server->client data sends
+// each packet sending code moved under if(Real) check is _large_ mangos speedup, and lot less server->client data sends
+
+class MANGOS_DLL_SPEC Aura
+{
+ friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
+
+ public:
+ //aura handlers
+ void HandleNULL(bool, bool)
+ {
+ // NOT IMPLEMENTED
+ }
+ void HandleUnused(bool, bool)
+ {
+ // NOT USED BY ANY SPELL OR USELESS
+ }
+ void HandleNoImmediateEffect(bool, bool)
+ {
+ // aura not have immediate effect at add/remove and handled by ID in other code place
+ }
+ void HandleBindSight(bool Apply, bool Real);
+ void HandleModPossess(bool Apply, bool Real);
+ void HandlePeriodicDamage(bool Apply, bool Real);
+ void HandleAuraDummy(bool Apply, bool Real);
+ void HandleAuraPeriodicDummy(bool apply, bool Real);
+ void HandleModConfuse(bool Apply, bool Real);
+ void HandleModCharm(bool Apply, bool Real);
+ void HandleModFear(bool Apply, bool Real);
+ void HandlePeriodicHeal(bool Apply, bool Real);
+ void HandleModAttackSpeed(bool Apply, bool Real);
+ void HandleModMeleeRangedSpeedPct(bool apply, bool Real);
+ void HandleModCombatSpeedPct(bool apply, bool Real);
+ void HandleModThreat(bool Apply, bool Real);
+ void HandleModTaunt(bool Apply, bool Real);
+ void HandleFeignDeath(bool Apply, bool Real);
+ void HandleAuraModDisarm(bool Apply, bool Real);
+ void HandleAuraModStalked(bool Apply, bool Real);
+ void HandleAuraWaterWalk(bool Apply, bool Real);
+ void HandleAuraFeatherFall(bool Apply, bool Real);
+ void HandleAuraHover(bool Apply, bool Real);
+ void HandleAddModifier(bool Apply, bool Real);
+ void HandleAuraModStun(bool Apply, bool Real);
+ void HandleModDamageDone(bool Apply, bool Real);
+ void HandleAuraUntrackable(bool Apply, bool Real);
+ void HandleAuraEmpathy(bool Apply, bool Real);
+ void HandleModOffhandDamagePercent(bool apply, bool Real);
+ void HandleAuraModRangedAttackPower(bool Apply, bool Real);
+ void HandleAuraModIncreaseEnergyPercent(bool Apply, bool Real);
+ void HandleAuraModIncreaseHealthPercent(bool Apply, bool Real);
+ void HandleAuraModRegenInterrupt(bool Apply, bool Real);
+ void HandleHaste(bool Apply, bool Real);
+ void HandlePeriodicTriggerSpell(bool Apply, bool Real);
+ void HandlePeriodicEnergize(bool Apply, bool Real);
+ void HandleAuraModResistanceExclusive(bool Apply, bool Real);
+ void HandleModStealth(bool Apply, bool Real);
+ void HandleInvisibility(bool Apply, bool Real);
+ void HandleInvisibilityDetect(bool Apply, bool Real);
+ void HandleAuraModTotalHealthPercentRegen(bool Apply, bool Real);
+ void HandleAuraModTotalManaPercentRegen(bool Apply, bool Real);
+ void HandleAuraModResistance(bool Apply, bool Real);
+ void HandleAuraModRoot(bool Apply, bool Real);
+ void HandleAuraModSilence(bool Apply, bool Real);
+ void HandleAuraModStat(bool Apply, bool Real);
+ void HandleAuraModIncreaseSpeed(bool Apply, bool Real);
+ void HandleAuraModIncreaseMountedSpeed(bool Apply, bool Real);
+ void HandleAuraModIncreaseFlightSpeed(bool Apply, bool Real);
+ void HandleAuraModDecreaseSpeed(bool Apply, bool Real);
+ void HandleAuraModUseNormalSpeed(bool Apply, bool Real);
+ void HandleAuraModIncreaseHealth(bool Apply, bool Real);
+ void HandleAuraModIncreaseEnergy(bool Apply, bool Real);
+ void HandleAuraModShapeshift(bool Apply, bool Real);
+ void HandleAuraModEffectImmunity(bool Apply, bool Real);
+ void HandleAuraModStateImmunity(bool Apply, bool Real);
+ void HandleAuraModSchoolImmunity(bool Apply, bool Real);
+ void HandleAuraModDmgImmunity(bool Apply, bool Real);
+ void HandleAuraModDispelImmunity(bool Apply, bool Real);
+ void HandleAuraProcTriggerSpell(bool Apply, bool Real);
+ void HandleAuraTrackCreatures(bool Apply, bool Real);
+ void HandleAuraTrackResources(bool Apply, bool Real);
+ void HandleAuraModParryPercent(bool Apply, bool Real);
+ void HandleAuraModDodgePercent(bool Apply, bool Real);
+ void HandleAuraModBlockPercent(bool Apply, bool Real);
+ void HandleAuraModCritPercent(bool Apply, bool Real);
+ void HandlePeriodicLeech(bool Apply, bool Real);
+ void HandleModHitChance(bool Apply, bool Real);
+ void HandleModSpellHitChance(bool Apply, bool Real);
+ void HandleAuraModScale(bool Apply, bool Real);
+ void HandlePeriodicManaLeech(bool Apply, bool Real);
+ void HandleModCastingSpeed(bool Apply, bool Real);
+ void HandleAuraMounted(bool Apply, bool Real);
+ void HandleWaterBreathing(bool Apply, bool Real);
+ void HandleModBaseResistance(bool Apply, bool Real);
+ void HandleModRegen(bool Apply, bool Real);
+ void HandleModPowerRegen(bool Apply, bool Real);
+ void HandleModPowerRegenPCT(bool Apply, bool Real);
+ void HandleChannelDeathItem(bool Apply, bool Real);
+ void HandlePeriodicDamagePCT(bool Apply, bool Real);
+ void HandleAuraModAttackPower(bool Apply, bool Real);
+ void HandleAuraTransform(bool Apply, bool Real);
+ void HandleModSpellCritChance(bool Apply, bool Real);
+ void HandleAuraModIncreaseSwimSpeed(bool Apply, bool Real);
+ void HandleModPowerCostPCT(bool Apply, bool Real);
+ void HandleModPowerCost(bool Apply, bool Real);
+ void HandleFarSight(bool Apply, bool Real);
+ void HandleModPossessPet(bool Apply, bool Real);
+ void HandleModMechanicImmunity(bool Apply, bool Real);
+ void HandleAuraModSkill(bool Apply, bool Real);
+ void HandleModDamagePercentDone(bool Apply, bool Real);
+ void HandleModPercentStat(bool Apply, bool Real);
+ void HandleModResistancePercent(bool Apply, bool Real);
+ void HandleAuraModBaseResistancePCT(bool Apply, bool Real);
+ void HandleModShieldBlockPCT(bool Apply, bool Real);
+ void HandleAuraTrackStealthed(bool Apply, bool Real);
+ void HandleModShieldBlock(bool Apply, bool Real);
+ void HandleForceReaction(bool Apply, bool Real);
+ void HandleAuraModRangedHaste(bool Apply, bool Real);
+ void HandleRangedAmmoHaste(bool Apply, bool Real);
+ void HandleModHealingDone(bool Apply, bool Real);
+ void HandleModTotalPercentStat(bool Apply, bool Real);
+ void HandleAuraModTotalThreat(bool Apply, bool Real);
+ void HandleModUnattackable(bool Apply, bool Real);
+ void HandleAuraModPacify(bool Apply, bool Real);
+ void HandleAuraGhost(bool Apply, bool Real);
+ void HandleAuraAllowFlight(bool Apply, bool Real);
+ void HandleModRating(bool apply, bool Real);
+ void HandleModTargetResistance(bool apply, bool Real);
+ void HandleAuraAttackPowerAttacker(bool apply, bool Real);
+ void HandleAuraModAttackPowerPercent(bool apply, bool Real);
+ void HandleAuraModRangedAttackPowerPercent(bool apply, bool Real);
+ void HandleAuraModRangedAttackPowerOfStatPercent(bool apply, bool Real);
+ void HandleSpiritOfRedemption(bool apply, bool Real);
+ void HandleAuraHealingPct(bool apply, bool Real);
+ void HandleModManaRegen(bool apply, bool Real);
+ void HandleComprehendLanguage(bool apply, bool Real);
+ void HandleAuraHealing(bool apply, bool Real);
+ void HandleShieldBlockValue(bool apply, bool Real);
+ void HandleModSpellCritChanceShool(bool apply, bool Real);
+ void HandleAuraRetainComboPoints(bool apply, bool Real);
+ void HandleModSpellDamagePercentFromStat(bool apply, bool Real);
+ void HandleModSpellHealingPercentFromStat(bool apply, bool Real);
+ void HandleAuraModDispelResist(bool apply, bool Real);
+ void HandleModSpellDamagePercentFromAttackPower(bool apply, bool Real);
+ void HandleModSpellHealingPercentFromAttackPower(bool apply, bool Real);
+ void HandleAuraModPacifyAndSilence(bool Apply, bool Real);
+ void HandleAuraModIncreaseMaxHealth(bool apply, bool Real);
+ void HandleAuraModExpertise(bool apply, bool Real);
+ void HandleForceMoveForward(bool apply, bool Real);
+ void HandleAuraModResistenceOfStatPercent(bool apply, bool Real);
+ void HandleAuraPowerBurn(bool apply, bool Real);
+ void HandleSchoolAbsorb(bool apply, bool Real);
+ void HandlePreventFleeing(bool apply, bool Real);
+ void HandleManaShield(bool apply, bool Real);
+ void HandleArenaPreparation(bool apply, bool Real);
+
+ virtual ~Aura();
+
+ void SetModifier(AuraType t, int32 a, uint32 pt, int32 miscValue);
+ Modifier* GetModifier() {return &m_modifier;}
+ int32 GetMiscValue() {return m_spellProto->EffectMiscValue[m_effIndex];}
+ int32 GetMiscBValue() {return m_spellProto->EffectMiscValueB[m_effIndex];}
+
+ SpellEntry const* GetSpellProto() const { return m_spellProto; }
+ uint32 GetId() const{ return m_spellProto->Id; }
+ uint64 GetCastItemGUID() const { return m_castItemGuid; }
+ uint32 GetEffIndex() const{ return m_effIndex; }
+ int32 GetBasePoints() const { return m_currentBasePoints; }
+
+ int32 GetAuraMaxDuration() const { return m_maxduration; }
+ void SetAuraMaxDuration(int32 duration) { m_maxduration = duration; }
+ int32 GetAuraDuration() const { return m_duration; }
+ void SetAuraDuration(int32 duration) { m_duration = duration; }
+ time_t GetAuraApplyTime() { return m_applyTime; }
+ void UpdateAuraDuration();
+ void SendAuraDurationForCaster(Player* caster);
+
+ uint64 const& GetCasterGUID() const { return m_caster_guid; }
+ Unit* GetCaster() const;
+ Unit* GetTarget() const { return m_target; }
+ void SetTarget(Unit* target) { m_target = target; }
+ void SetLoadedState(uint64 caster_guid,int32 damage,int32 maxduration,int32 duration,int32 charges)
+ {
+ m_caster_guid = caster_guid;
+ m_modifier.m_amount = damage;
+ m_maxduration = maxduration;
+ m_duration = duration;
+ m_procCharges = charges;
+ }
+
+ uint8 GetAuraSlot() const { return m_auraSlot; }
+ void SetAuraSlot(uint8 slot) { m_auraSlot = slot; }
+ void UpdateAuraCharges()
+ {
+ uint8 slot = GetAuraSlot();
+
+ // only aura inslot with charges and without stack limitation
+ if (slot < MAX_AURAS && m_procCharges >= 1 && GetSpellProto()->StackAmount==0)
+ SetAuraApplication(slot, m_procCharges - 1);
+ }
+
+ bool IsPositive() { return m_positive; }
+ void SetNegative() { m_positive = false; }
+ void SetPositive() { m_positive = true; }
+
+ bool IsPermanent() const { return m_permanent; }
+ bool IsAreaAura() const { return m_isAreaAura; }
+ bool IsPeriodic() const { return m_isPeriodic; }
+ bool IsTrigger() const { return m_isTrigger; }
+ bool IsPassive() const { return m_isPassive; }
+ bool IsPersistent() const { return m_isPersistent; }
+ bool IsDeathPersistent() const { return m_isDeathPersist; }
+ bool IsRemovedOnShapeLost() const { return m_isRemovedOnShapeLost; }
+ bool IsInUse() const { return m_in_use;}
+
+ virtual void Update(uint32 diff);
+ void ApplyModifier(bool apply, bool Real = false);
+
+ void _AddAura();
+ void _RemoveAura();
+
+ void TriggerSpell();
+
+ bool IsUpdated() { return m_updated; }
+ void SetUpdated(bool val) { m_updated = val; }
+ void SetRemoveMode(AuraRemoveMode mode) { m_removeMode = mode; }
+
+ int32 m_procCharges;
+
+ virtual Unit* GetTriggerTarget() const { return m_target; }
+
+ // add/remove SPELL_AURA_MOD_SHAPESHIFT (36) linked auras
+ void HandleShapeshiftBoosts(bool apply);
+
+ // Allow Apply Aura Handler to modify and access m_AuraDRGroup
+ void setDiminishGroup(DiminishingGroup group) { m_AuraDRGroup = group; }
+ DiminishingGroup getDiminishGroup() const { return m_AuraDRGroup; }
+
+ void PeriodicTick();
+ void PeriodicDummyTick();
+ protected:
+ Aura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
+
+ Modifier m_modifier;
+ SpellModifier *m_spellmod;
+ uint32 m_effIndex;
+ SpellEntry const *m_spellProto;
+ int32 m_currentBasePoints; // cache SpellEntry::EffectBasePoints and use for set custom base points
+ uint64 m_caster_guid;
+ Unit* m_target;
+ int32 m_maxduration;
+ int32 m_duration;
+ int32 m_timeCla;
+ uint64 m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted
+ time_t m_applyTime;
+
+ AuraRemoveMode m_removeMode;
+
+ uint8 m_auraSlot;
+
+ bool m_positive:1;
+ bool m_permanent:1;
+ bool m_isPeriodic:1;
+ bool m_isTrigger:1;
+ bool m_isAreaAura:1;
+ bool m_isPassive:1;
+ bool m_isPersistent:1;
+ bool m_isDeathPersist:1;
+ bool m_isRemovedOnShapeLost:1;
+ bool m_updated:1;
+ bool m_in_use:1; // true while in Aura::ApplyModifier call
+
+ int32 m_periodicTimer;
+ uint32 m_PeriodicEventId;
+ DiminishingGroup m_AuraDRGroup;
+ private:
+ void UpdateSlotCounterAndDuration(bool add);
+ void CleanupTriggeredSpells();
+ void SetAura(uint32 slot, bool remove) { m_target->SetUInt32Value(UNIT_FIELD_AURA + slot, remove ? 0 : GetId()); }
+ void SetAuraFlag(uint32 slot, bool add);
+ void SetAuraLevel(uint32 slot, uint32 level);
+ void SetAuraApplication(uint32 slot, int8 count);
+};
+
+class MANGOS_DLL_SPEC AreaAura : public Aura
+{
+ public:
+ AreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
+ ~AreaAura();
+ void Update(uint32 diff);
+ private:
+ float m_radius;
+ AreaAuraType m_areaAuraType;
+};
+
+class MANGOS_DLL_SPEC PersistentAreaAura : public Aura
+{
+ public:
+ PersistentAreaAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
+ ~PersistentAreaAura();
+ void Update(uint32 diff);
+};
+
+class MANGOS_DLL_SPEC SingleEnemyTargetAura : public Aura
+{
+ friend Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster, Item* castItem);
+
+ public:
+ ~SingleEnemyTargetAura();
+ Unit* GetTriggerTarget() const;
+
+ protected:
+ SingleEnemyTargetAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
+ uint64 m_casters_target_guid;
+};
+
+Aura* CreateAura(SpellEntry const* spellproto, uint32 eff, int32 *currentBasePoints, Unit *target, Unit *caster = NULL, Item* castItem = NULL);
+#endif