From b8b9abcc08be737705e651e13fb6b1c165fbc935 Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Sat, 11 Apr 2015 15:53:32 +0300 Subject: [PATCH] Fix 0002169 --- lib/spells/CSpellHandler.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/spells/CSpellHandler.cpp b/lib/spells/CSpellHandler.cpp index bf7fd27ec..385803cf8 100644 --- a/lib/spells/CSpellHandler.cpp +++ b/lib/spells/CSpellHandler.cpp @@ -470,10 +470,21 @@ ESpellCastProblem::ESpellCastProblem CSpell::isImmuneBy(const IBonusBearer* obj) return ESpellCastProblem::STACK_IMMUNE_TO_SPELL; } + //spell-based spell immunity (only ANTIMAGIC in OH3) is treated as absolute + std::stringstream cachingStr; + cachingStr << "type_" << Bonus::LEVEL_SPELL_IMMUNITY << "source_" << Bonus::SPELL_EFFECT; + + TBonusListPtr levelImmunitiesFromSpell = obj->getBonuses(Selector::type(Bonus::LEVEL_SPELL_IMMUNITY).And(Selector::sourceType(Bonus::SPELL_EFFECT)), cachingStr.str()); + + if(levelImmunitiesFromSpell->size() > 0 && levelImmunitiesFromSpell->totalValue() >= level && level) + { + return ESpellCastProblem::STACK_IMMUNE_TO_SPELL; + } + //check receptivity if (isPositive() && obj->hasBonusOfType(Bonus::RECEPTIVE)) //accept all positive spells return ESpellCastProblem::OK; - + //3. Check negation //FIXME: Orb of vulnerability mechanics is not such trivial if(obj->hasBonusOfType(Bonus::NEGATE_ALL_NATURAL_IMMUNITIES)) //Orb of vulnerability