diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 00b7ab861..c2ee37d17 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4643,6 +4643,10 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_CASTER_AURASTATE; } + // totem immunity for channeled spells(needs to be before spell cast) + if (IsChanneledSpell(m_spellInfo) && target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->IsTotem()) + return SPELL_FAILED_IMMUNE; + bool non_caster_target = target != m_caster && !IsSpellWithCasterSourceTargetsOnly(m_spellInfo); if(non_caster_target) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index a19ac8789..c43936a93 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -453,15 +453,11 @@ Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, holder, { case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: m_areaAuraType = AREA_AURA_PARTY; - if (target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->IsTotem()) - m_modifier.m_auraname = SPELL_AURA_NONE; break; case SPELL_EFFECT_APPLY_AREA_AURA_RAID: m_areaAuraType = AREA_AURA_RAID; - if (target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->IsTotem()) - m_modifier.m_auraname = SPELL_AURA_NONE; // Light's Beacon not applied to caster itself (TODO: more generic check for another similar spell if any?) - else if (target == caster_ptr && spellproto->Id == 53651) + if (target == caster_ptr && spellproto->Id == 53651) m_modifier.m_auraname = SPELL_AURA_NONE; break; case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: @@ -485,6 +481,10 @@ Unit *caster, Item* castItem) : Aura(spellproto, eff, currentBasePoints, holder, MANGOS_ASSERT(false); break; } + + // totems are immune to any kind of area auras + if (target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->IsTotem()) + m_modifier.m_auraname = SPELL_AURA_NONE; } AreaAura::~AreaAura() diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index a5b8548b0..bf893070d 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -111,25 +111,29 @@ inline bool IsSpellHaveEffect(SpellEntry const *spellInfo, SpellEffects effect) return false; } +inline bool IsAuraApplyEffect(SpellEntry const *spellInfo, SpellEffectIndex effecIdx) +{ + switch (spellInfo->Effect[effecIdx]) + { + case SPELL_EFFECT_APPLY_AURA: + case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: + case SPELL_EFFECT_APPLY_AREA_AURA_RAID: + case SPELL_EFFECT_APPLY_AREA_AURA_PET: + case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: + case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY: + case SPELL_EFFECT_APPLY_AREA_AURA_OWNER: + return true; + } + return false; +} + inline bool IsSpellAppliesAura(SpellEntry const *spellInfo, uint32 effectMask = ((1 << EFFECT_INDEX_0) | (1 << EFFECT_INDEX_1) | (1 << EFFECT_INDEX_2))) { for(int i = 0; i < MAX_EFFECT_INDEX; ++i) - { if (effectMask & (1 << i)) - { - switch (spellInfo->Effect[i]) - { - case SPELL_EFFECT_APPLY_AURA: - case SPELL_EFFECT_APPLY_AREA_AURA_PARTY: - case SPELL_EFFECT_APPLY_AREA_AURA_RAID: - case SPELL_EFFECT_APPLY_AREA_AURA_PET: - case SPELL_EFFECT_APPLY_AREA_AURA_FRIEND: - case SPELL_EFFECT_APPLY_AREA_AURA_ENEMY: - case SPELL_EFFECT_APPLY_AREA_AURA_OWNER: - return true; - } - } - } + if (IsAuraApplyEffect(spellInfo, SpellEffectIndex(i))) + return true; + return false; } @@ -148,6 +152,19 @@ inline bool IsEffectHandledOnDelayedSpellLaunch(SpellEntry const *spellInfo, Spe } } +inline bool IsPeriodicRegenerateEffect(SpellEntry const *spellInfo, SpellEffectIndex effecIdx) +{ + switch (AuraType(spellInfo->EffectApplyAuraName[effecIdx])) + { + case SPELL_AURA_PERIODIC_ENERGIZE: + case SPELL_AURA_PERIODIC_HEAL: + case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: + return true; + default: + return false; + } +} + inline bool IsSpellHaveAura(SpellEntry const *spellInfo, AuraType aura) { for(int i = 0; i < MAX_EFFECT_INDEX; ++i) diff --git a/src/game/Totem.cpp b/src/game/Totem.cpp index f49a4a6b8..ac59285c7 100644 --- a/src/game/Totem.cpp +++ b/src/game/Totem.cpp @@ -183,24 +183,33 @@ void Totem::SetTypeBySummonSpell(SpellEntry const * spellProto) bool Totem::IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index) const { - // TODO: possibly all negative auras immune? switch(spellInfo->Effect[index]) { case SPELL_EFFECT_ATTACK_ME: + // immune to any type of regeneration effects hp/mana etc. + case SPELL_EFFECT_HEAL: + case SPELL_EFFECT_HEAL_MAX_HEALTH: + case SPELL_EFFECT_HEAL_MECHANICAL: + case SPELL_EFFECT_HEAL_PCT: + case SPELL_EFFECT_ENERGIZE: + case SPELL_EFFECT_ENERGIZE_PCT: return true; default: break; } - switch(spellInfo->EffectApplyAuraName[index]) + + if (!IsPositiveSpell(spellInfo)) { - case SPELL_AURA_PERIODIC_DAMAGE: - case SPELL_AURA_PERIODIC_LEECH: - case SPELL_AURA_MOD_FEAR: - case SPELL_AURA_TRANSFORM: - case SPELL_AURA_MOD_TAUNT: + // immune to all negative auras + if (IsAuraApplyEffect(spellInfo, index)) return true; - default: - break; } + else + { + // immune to any type of regeneration auras hp/mana etc. + if (IsPeriodicRegenerateEffect(spellInfo, index)) + return true; + } + return Creature::IsImmuneToSpellEffect(spellInfo, index); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index e884eb9d0..303fb2149 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "11707" + #define REVISION_NR "11708" #endif // __REVISION_NR_H__