mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-31 17:15:34 +00:00
Fix for damage/restore effects using the instant apply path when they have a duration
This commit is contained in:
parent
239c0071f5
commit
a653716e2c
1 changed files with 24 additions and 34 deletions
|
@ -64,8 +64,9 @@ namespace
|
|||
}
|
||||
|
||||
// TODO: refactor the effect tick functions in Actors so they can be reused here
|
||||
void applyInstantEffectTick(int effectId, const MWWorld::Ptr& target, float magnitude)
|
||||
void applyInstantEffectTick(MWMechanics::EffectKey effect, const MWWorld::Ptr& target, float magnitude)
|
||||
{
|
||||
int effectId = effect.mId;
|
||||
if (effectId == ESM::MagicEffect::DamageHealth)
|
||||
{
|
||||
applyDynamicStatsEffect(0, target, magnitude * -1);
|
||||
|
@ -90,6 +91,27 @@ namespace
|
|||
{
|
||||
applyDynamicStatsEffect(1, target, magnitude);
|
||||
}
|
||||
else if (effectId == ESM::MagicEffect::DamageAttribute || effectId == ESM::MagicEffect::RestoreAttribute)
|
||||
{
|
||||
int attribute = effect.mArg;
|
||||
MWMechanics::AttributeValue value = target.getClass().getCreatureStats(target).getAttribute(attribute);
|
||||
if (effectId == ESM::MagicEffect::DamageAttribute)
|
||||
value.damage(magnitude);
|
||||
else
|
||||
value.restore(magnitude);
|
||||
target.getClass().getCreatureStats(target).setAttribute(attribute, value);
|
||||
}
|
||||
else if (effectId == ESM::MagicEffect::DamageSkill || effectId == ESM::MagicEffect::RestoreSkill)
|
||||
{
|
||||
if (target.getTypeName() != typeid(ESM::NPC).name())
|
||||
return;
|
||||
int skill = effect.mArg;
|
||||
MWMechanics::SkillValue& value = target.getClass().getNpcStats(target).getSkill(skill);
|
||||
if (effectId == ESM::MagicEffect::DamageSkill)
|
||||
value.damage(magnitude);
|
||||
else
|
||||
value.restore(magnitude);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -509,7 +531,7 @@ namespace MWMechanics
|
|||
else
|
||||
{
|
||||
if (hasDuration && target.getClass().isActor())
|
||||
applyInstantEffectTick(effectIt->mEffectID, target, magnitude);
|
||||
applyInstantEffectTick(EffectKey(*effectIt), target, magnitude);
|
||||
else
|
||||
applyInstantEffect(target, caster, EffectKey(*effectIt), magnitude);
|
||||
}
|
||||
|
@ -526,16 +548,6 @@ namespace MWMechanics
|
|||
}
|
||||
}
|
||||
|
||||
// HACK: Damage attribute/skill actually has a duration, even though the actual effect is instant and permanent.
|
||||
// This was probably just done to have the effect visible in the magic menu for a while
|
||||
// to notify the player they've been damaged?
|
||||
if (effectIt->mEffectID == ESM::MagicEffect::DamageAttribute
|
||||
|| effectIt->mEffectID == ESM::MagicEffect::DamageSkill
|
||||
|| effectIt->mEffectID == ESM::MagicEffect::RestoreAttribute
|
||||
|| effectIt->mEffectID == ESM::MagicEffect::RestoreSkill
|
||||
)
|
||||
applyInstantEffect(target, caster, EffectKey(*effectIt), magnitude);
|
||||
|
||||
if (target.getClass().isActor() || magicEffect->mData.mFlags & ESM::MagicEffect::NoDuration)
|
||||
{
|
||||
// Play sound, only for the first effect
|
||||
|
@ -625,28 +637,6 @@ namespace MWMechanics
|
|||
}
|
||||
else
|
||||
{
|
||||
if (effectId == ESM::MagicEffect::DamageAttribute || effectId == ESM::MagicEffect::RestoreAttribute)
|
||||
{
|
||||
int attribute = effect.mArg;
|
||||
AttributeValue value = target.getClass().getCreatureStats(target).getAttribute(attribute);
|
||||
if (effectId == ESM::MagicEffect::DamageAttribute)
|
||||
value.damage(magnitude);
|
||||
else
|
||||
value.restore(magnitude);
|
||||
target.getClass().getCreatureStats(target).setAttribute(attribute, value);
|
||||
}
|
||||
else if (effectId == ESM::MagicEffect::DamageSkill || effectId == ESM::MagicEffect::RestoreSkill)
|
||||
{
|
||||
if (target.getTypeName() != typeid(ESM::NPC).name())
|
||||
return;
|
||||
int skill = effect.mArg;
|
||||
SkillValue& value = target.getClass().getNpcStats(target).getSkill(skill);
|
||||
if (effectId == ESM::MagicEffect::DamageSkill)
|
||||
value.damage(magnitude);
|
||||
else
|
||||
value.restore(magnitude);
|
||||
}
|
||||
|
||||
if (effectId == ESM::MagicEffect::CurePoison)
|
||||
target.getClass().getCreatureStats(target).getActiveSpells().purgeEffect(ESM::MagicEffect::Poison);
|
||||
else if (effectId == ESM::MagicEffect::CureParalyzation)
|
||||
|
|
Loading…
Reference in a new issue