Don't play magic effect sounds & visual effects for unsuitable targets (Fixes #2811)

sceneinput
scrawl 10 years ago
parent 211deeb63e
commit 1e18a73b1c

@ -489,8 +489,8 @@ namespace MWMechanics
if (!wasDead && isDead)
MWBase::Environment::get().getMechanicsManager()->actorKilled(target, caster);
}
else
applyInstantEffect(target, caster, EffectKey(*effectIt), magnitude);
else if (!applyInstantEffect(target, caster, EffectKey(*effectIt), magnitude))
continue;
}
// Re-casting a summon effect will remove the creature from previous castings of that effect.
@ -559,7 +559,7 @@ namespace MWMechanics
target.getClass().onHit(target, 0.f, true, MWWorld::Ptr(), caster, true);
}
void CastSpell::applyInstantEffect(const MWWorld::Ptr &target, const MWWorld::Ptr &caster, const MWMechanics::EffectKey& effect, float magnitude)
bool CastSpell::applyInstantEffect(const MWWorld::Ptr &target, const MWWorld::Ptr &caster, const MWMechanics::EffectKey& effect, float magnitude)
{
short effectId = effect.mId;
if (target.getClass().canLock(target))
@ -572,6 +572,7 @@ namespace MWMechanics
MWBase::Environment::get().getWindowManager()->messageBox("#{sMagicLockSuccess}");
target.getClass().lock(target, static_cast<int>(magnitude));
}
return true;
}
else if (effectId == ESM::MagicEffect::Open)
{
@ -590,43 +591,55 @@ namespace MWMechanics
}
else
MWBase::Environment::get().getSoundManager()->playSound3D(target, "Open Lock Fail", 1.f, 1.f);
return true;
}
}
else
else if (target.getClass().isActor())
{
if (effectId == ESM::MagicEffect::CurePoison)
switch (effectId)
{
case ESM::MagicEffect::CurePoison:
target.getClass().getCreatureStats(target).getActiveSpells().purgeEffect(ESM::MagicEffect::Poison);
else if (effectId == ESM::MagicEffect::CureParalyzation)
return true;
case ESM::MagicEffect::CureParalyzation:
target.getClass().getCreatureStats(target).getActiveSpells().purgeEffect(ESM::MagicEffect::Paralyze);
else if (effectId == ESM::MagicEffect::CureCommonDisease)
return true;
case ESM::MagicEffect::CureCommonDisease:
target.getClass().getCreatureStats(target).getSpells().purgeCommonDisease();
else if (effectId == ESM::MagicEffect::CureBlightDisease)
return true;
case ESM::MagicEffect::CureBlightDisease:
target.getClass().getCreatureStats(target).getSpells().purgeBlightDisease();
else if (effectId == ESM::MagicEffect::CureCorprusDisease)
return true;
case ESM::MagicEffect::CureCorprusDisease:
target.getClass().getCreatureStats(target).getSpells().purgeCorprusDisease();
else if (effectId == ESM::MagicEffect::Dispel)
return true;
case ESM::MagicEffect::Dispel:
target.getClass().getCreatureStats(target).getActiveSpells().purgeAll(magnitude);
else if (effectId == ESM::MagicEffect::RemoveCurse)
return true;
case ESM::MagicEffect::RemoveCurse:
target.getClass().getCreatureStats(target).getSpells().purgeCurses();
return true;
}
if (target != MWBase::Environment::get().getWorld()->getPlayerPtr())
return;
if (!MWBase::Environment::get().getWorld()->isTeleportingEnabled())
return;
return false;
if (effectId == ESM::MagicEffect::DivineIntervention)
{
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "divinemarker");
return true;
}
else if (effectId == ESM::MagicEffect::AlmsiviIntervention)
{
MWBase::Environment::get().getWorld()->teleportToClosestMarker(target, "templemarker");
return true;
}
else if (effectId == ESM::MagicEffect::Mark)
{
MWBase::Environment::get().getWorld()->getPlayer().markPosition(
target.getCell(), target.getRefData().getPosition());
return true;
}
else if (effectId == ESM::MagicEffect::Recall)
{
@ -640,8 +653,10 @@ namespace MWMechanics
markedPosition, false);
action.execute(target);
}
return true;
}
}
return false;
}

@ -97,7 +97,8 @@ namespace MWMechanics
const ESM::EffectList& effects, ESM::RangeType range, bool reflected=false, bool exploded=false);
/// @note \a caster can be any type of object, or even an empty object.
void applyInstantEffect (const MWWorld::Ptr& target, const MWWorld::Ptr& caster, const MWMechanics::EffectKey& effect, float magnitude);
/// @return was the target suitable for the effect?
bool applyInstantEffect (const MWWorld::Ptr& target, const MWWorld::Ptr& caster, const MWMechanics::EffectKey& effect, float magnitude);
};
}

@ -2656,10 +2656,6 @@ namespace MWWorld
target = result.mHitObject;
hitPosition = result.mHitPos;
// don't allow casting on non-activatable objects
if (!target.isEmpty() && !target.getClass().isActor() && target.getClass().getName(target).empty())
target = MWWorld::Ptr();
std::string selectedSpell = stats.getSpells().getSelectedSpell();
MWMechanics::CastSpell cast(actor, target);

Loading…
Cancel
Save