diff options
| author | xinef1 <w.szyszko2@gmail.com> | 2017-02-05 22:29:23 +0100 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2019-06-15 18:41:09 +0200 | 
| commit | b711f0bcaef7e966140fce4929ff5196b6b2bbf6 (patch) | |
| tree | 7d6b3cfffac04fe57df53ef1c58affc9efe70796 /src/server/game/Spells/Spell.cpp | |
| parent | 68cc366d88fd9cb4c759dc991568d994a29ba23e (diff) | |
Core/Spells: Added SPELL_FAILED_NOTHING_TO_STEAL error (#19036)
Corrected Dispel check in sanctuary area
Added root check for SPELL_EFFECT_JUMP and SPELL_EFFECT_JUMP_DEST
(cherrypicked from 3c605ba614c45c4b8f99c12fb49f342c068054a5)
Diffstat (limited to 'src/server/game/Spells/Spell.cpp')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 43 | 
1 files changed, 42 insertions, 1 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 76c45ce96f4..43c2f1c29a5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4970,6 +4970,18 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint      if (Unit* target = m_targets.GetUnitTarget())      { +        // do not allow to cast on hostile targets in sanctuary +        if (!m_caster->IsFriendlyTo(target)) +        { +            if (m_caster->IsInSanctuary() || target->IsInSanctuary()) +            { +                // fix for duels +                Player* player = m_caster->ToPlayer(); +                if (!player || !player->duel || target != player->duel->opponent) +                    return SPELL_FAILED_NOTHING_TO_DISPEL; +            } +        } +          SpellCastResult castResult = m_spellInfo->CheckTarget(m_caster, target, m_caster->GetEntry() == WORLD_TRIGGER); // skip stealth checks for GO casts          if (castResult != SPELL_CAST_OK)              return castResult; @@ -5532,8 +5544,30 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint              }              case SPELL_EFFECT_STEAL_BENEFICIAL_BUFF:              { -                if (m_targets.GetUnitTarget() == m_caster) +                if (!m_targets.GetUnitTarget() || m_targets.GetUnitTarget() == m_caster)                      return SPELL_FAILED_BAD_TARGETS; + +                uint32 dispelMask = m_spellInfo->GetDispelMask(DispelType(effect->MiscValue)); +                bool hasStealableAura = false; +                for (AuraApplication* visibleAura : m_targets.GetUnitTarget()->GetVisibleAuras()) +                { +                    if (!visibleAura->IsPositive()) +                        continue; + +                    Aura const* aura = visibleAura->GetBase(); +                    if (!(aura->GetSpellInfo()->GetDispelMask() & dispelMask)) +                        continue; + +                    if (aura->IsPassive() || aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_NOT_STEALABLE)) +                        continue; + +                    hasStealableAura = true; +                    break; +                } + +                if (!hasStealableAura) +                    return SPELL_FAILED_NOTHING_TO_STEAL; +                  break;              }              case SPELL_EFFECT_LEAP_BACK: @@ -5547,6 +5581,13 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint                  }                  break;              } +            case SPELL_EFFECT_JUMP: +            case SPELL_EFFECT_JUMP_DEST: +            { +                if (m_caster->HasUnitState(UNIT_STATE_ROOT)) +                    return SPELL_FAILED_ROOTED; +                break; +            }              case SPELL_EFFECT_TALENT_SPEC_SELECT:              {                  ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(m_misc.SpecializationId);  | 
