1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-12-01 18:04:31 +00:00

Don't mark skill affecting effects as invalid if the target is a creature

This commit is contained in:
Evil Eye 2025-10-11 14:47:45 +02:00
parent b905836f45
commit f783993c56

View file

@ -714,9 +714,7 @@ namespace MWMechanics
damageAttribute(target, effect, effect.mMagnitude); damageAttribute(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::DamageSkill: case ESM::MagicEffect::DamageSkill:
if (!target.getClass().isNpc()) if (!godmode && target.getClass().isNpc())
invalid = true;
else if (!godmode)
{ {
// Damage Skill abilities reduce base skill :todd: // Damage Skill abilities reduce base skill :todd:
if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues)) if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues))
@ -734,9 +732,7 @@ namespace MWMechanics
restoreAttribute(target, effect, effect.mMagnitude); restoreAttribute(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::RestoreSkill: case ESM::MagicEffect::RestoreSkill:
if (!target.getClass().isNpc()) if (target.getClass().isNpc())
invalid = true;
else
restoreSkill(target, effect, effect.mMagnitude); restoreSkill(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::RestoreHealth: case ESM::MagicEffect::RestoreHealth:
@ -802,23 +798,22 @@ namespace MWMechanics
fortifyAttribute(target, effect, effect.mMagnitude); fortifyAttribute(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::DrainSkill: case ESM::MagicEffect::DrainSkill:
if (!target.getClass().isNpc()) if (!godmode && target.getClass().isNpc())
invalid = true;
else if (!godmode)
damageSkill(target, effect, effect.mMagnitude); damageSkill(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::FortifySkill: case ESM::MagicEffect::FortifySkill:
if (!target.getClass().isNpc()) if (target.getClass().isNpc())
invalid = true;
else if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues))
{ {
// Abilities affect base stats, but not for drain if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues))
auto& npcStats = target.getClass().getNpcStats(target); {
auto& skill = npcStats.getSkill(effect.getSkillOrAttribute()); // Abilities affect base stats, but not for drain
skill.setBase(skill.getBase() + effect.mMagnitude); auto& npcStats = target.getClass().getNpcStats(target);
auto& skill = npcStats.getSkill(effect.getSkillOrAttribute());
skill.setBase(skill.getBase() + effect.mMagnitude);
}
else
fortifySkill(target, effect, effect.mMagnitude);
} }
else
fortifySkill(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::FortifyMaximumMagicka: case ESM::MagicEffect::FortifyMaximumMagicka:
recalculateMagicka = true; recalculateMagicka = true;
@ -845,9 +840,7 @@ namespace MWMechanics
} }
break; break;
case ESM::MagicEffect::AbsorbSkill: case ESM::MagicEffect::AbsorbSkill:
if (!target.getClass().isNpc()) if (!godmode && target.getClass().isNpc())
invalid = true;
else if (!godmode)
{ {
damageSkill(target, effect, effect.mMagnitude); damageSkill(target, effect, effect.mMagnitude);
if (!caster.isEmpty() && caster.getClass().isNpc()) if (!caster.isEmpty() && caster.getClass().isNpc())
@ -1281,18 +1274,22 @@ namespace MWMechanics
fortifyAttribute(target, effect, -effect.mMagnitude); fortifyAttribute(target, effect, -effect.mMagnitude);
break; break;
case ESM::MagicEffect::DrainSkill: case ESM::MagicEffect::DrainSkill:
restoreSkill(target, effect, effect.mMagnitude); if (target.getClass().isNpc())
restoreSkill(target, effect, effect.mMagnitude);
break; break;
case ESM::MagicEffect::FortifySkill: case ESM::MagicEffect::FortifySkill:
// Abilities affect base stats, but not for drain if (target.getClass().isNpc())
if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues))
{ {
auto& npcStats = target.getClass().getNpcStats(target); // Abilities affect base stats, but not for drain
auto& skill = npcStats.getSkill(effect.getSkillOrAttribute()); if (spellParams.hasFlag(ESM::ActiveSpells::Flag_AffectsBaseValues))
skill.setBase(skill.getBase() - effect.mMagnitude); {
auto& npcStats = target.getClass().getNpcStats(target);
auto& skill = npcStats.getSkill(effect.getSkillOrAttribute());
skill.setBase(skill.getBase() - effect.mMagnitude);
}
else
fortifySkill(target, effect, -effect.mMagnitude);
} }
else
fortifySkill(target, effect, -effect.mMagnitude);
break; break;
case ESM::MagicEffect::FortifyMaximumMagicka: case ESM::MagicEffect::FortifyMaximumMagicka:
target.getClass().getCreatureStats(target).recalculateMagicka(); target.getClass().getCreatureStats(target).recalculateMagicka();
@ -1307,8 +1304,9 @@ namespace MWMechanics
break; break;
case ESM::MagicEffect::AbsorbSkill: case ESM::MagicEffect::AbsorbSkill:
{ {
if (target.getClass().isNpc())
restoreSkill(target, effect, effect.mMagnitude);
const auto caster = world->searchPtrViaActorId(spellParams.getCasterActorId()); const auto caster = world->searchPtrViaActorId(spellParams.getCasterActorId());
restoreSkill(target, effect, effect.mMagnitude);
if (!caster.isEmpty() && caster.getClass().isNpc()) if (!caster.isEmpty() && caster.getClass().isNpc())
fortifySkill(caster, effect, -effect.mMagnitude); fortifySkill(caster, effect, -effect.mMagnitude);
} }