diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 11 |
4 files changed, 33 insertions, 4 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d247e46e595..c6a8d2426da 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9264,6 +9264,26 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) const return false; } +uint32 Unit::GetSchoolImmunityMask() const +{ + uint32 mask = 0; + SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_SCHOOL]; + for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) + mask |= itr->type; + + return mask; +} + +uint32 Unit::GetMechanicImmunityMask() const +{ + uint32 mask = 0; + SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC]; + for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) + mask |= (1 << itr->type); + + return mask; +} + bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { if (!spellInfo) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index ebf05876e10..881d753d7e4 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2043,6 +2043,8 @@ class Unit : public WorldObject void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply); void ApplySpellDispelImmunity(const SpellInfo* spellProto, DispelType type, bool apply); virtual bool IsImmunedToSpell(SpellInfo const* spellInfo) const; // redefined in Creature + uint32 GetSchoolImmunityMask() const; + uint32 GetMechanicImmunityMask() const; bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const; bool IsImmunedToDamage(SpellInfo const* spellInfo) const; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 79971717305..92a29dd5c73 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -3205,6 +3205,10 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 switch (miscVal) { + case 27: + target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); + aura_immunity_list.push_back(SPELL_AURA_MOD_SILENCE); + break; case 96: case 1615: { diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 0bd632eb9f6..6eabf259171 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3852,6 +3852,10 @@ void Spell::SendSpellStart() TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); uint32 castFlags = CAST_FLAG_HAS_TRAJECTORY; + uint32 schoolImmunityMask = m_caster->GetSchoolImmunityMask(); + uint32 mechanicImmunityMask = m_caster->GetMechanicImmunityMask(); + if (schoolImmunityMask || mechanicImmunityMask) + castFlags |= CAST_FLAG_IMMUNITY; if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) castFlags |= CAST_FLAG_PENDING; @@ -3925,12 +3929,11 @@ void Spell::SendSpellStart() castData.Ammo.InventoryType = 0; }**/ - /** @todo implement spell immunity packet data if (castFlags & CAST_FLAG_IMMUNITY) { - castData.Immunities.School = 0; - castData.Immunities.Value = 0; - }**/ + castData.Immunities.School = schoolImmunityMask; + castData.Immunities.Value = mechanicImmunityMask; + } /** @todo implement heal prediction packet data if (castFlags & CAST_FLAG_HEAL_PREDICTION) |