1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-28 13:09:40 +00:00

Merge pull request #2406 from Capostrophic/invalid

Erase effects with invalid indices from spells (bug #5050)
This commit is contained in:
Andrei Kortunov 2019-06-03 09:21:11 +04:00 committed by GitHub
commit a02f730a77
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 13 deletions

View file

@ -96,6 +96,7 @@
Bug #5028: Offered price caps are not trading-specific Bug #5028: Offered price caps are not trading-specific
Bug #5038: Enchanting success chance calculations are blatantly wrong Bug #5038: Enchanting success chance calculations are blatantly wrong
Bug #5047: # in cell names sets color Bug #5047: # in cell names sets color
Bug #5050: Invalid spell effects are not handled gracefully
Feature #1774: Handle AvoidNode Feature #1774: Handle AvoidNode
Feature #2229: Improve pathfinding AI Feature #2229: Improve pathfinding AI
Feature #3025: Analogue gamepad movement controls Feature #3025: Analogue gamepad movement controls

View file

@ -205,40 +205,48 @@ void ESMStore::validate()
continue; continue;
bool changed = false; bool changed = false;
for (ESM::ENAMstruct& effect : spell.mEffects.mList) auto iter = spell.mEffects.mList.begin();
while (iter != spell.mEffects.mList.end())
{ {
const ESM::MagicEffect* mgef = mMagicEffects.search(effect.mEffectID); const ESM::MagicEffect* mgef = mMagicEffects.search(iter->mEffectID);
if (!mgef) // Do nothing for now if (!mgef)
{
Log(Debug::Verbose) << "Spell '" << spell.mId << "' has an an invalid effect (index " << iter->mEffectID << ") present, dropping it.";
iter = spell.mEffects.mList.erase(iter);
changed = true;
continue; continue;
}
if (mgef->mData.mFlags & ESM::MagicEffect::TargetSkill) if (mgef->mData.mFlags & ESM::MagicEffect::TargetSkill)
{ {
if (effect.mAttribute != -1) if (iter->mAttribute != -1)
{ {
effect.mAttribute = -1; iter->mAttribute = -1;
Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(effect.mEffectID) << Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(iter->mEffectID) <<
" effect of spell '" << spell.mId << "' has an attribute argument present, dropping it."; " effect of spell '" << spell.mId << "' has an attribute argument present, dropping it.";
changed = true; changed = true;
} }
} }
else if (mgef->mData.mFlags & ESM::MagicEffect::TargetAttribute) else if (mgef->mData.mFlags & ESM::MagicEffect::TargetAttribute)
{ {
if (effect.mSkill != -1) if (iter->mSkill != -1)
{ {
effect.mSkill = -1; iter->mSkill = -1;
Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(effect.mEffectID) << Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(iter->mEffectID) <<
" effect of spell '" << spell.mId << "' has a skill argument present, dropping it."; " effect of spell '" << spell.mId << "' has a skill argument present, dropping it.";
changed = true; changed = true;
} }
} }
else if (effect.mSkill != -1 || effect.mAttribute != -1) else if (iter->mSkill != -1 || iter->mAttribute != -1)
{ {
effect.mSkill = -1; iter->mSkill = -1;
effect.mAttribute = -1; iter->mAttribute = -1;
Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(effect.mEffectID) << Log(Debug::Verbose) << ESM::MagicEffect::effectIdToString(iter->mEffectID) <<
" effect of spell '" << spell.mId << "' has argument(s) present, dropping them."; " effect of spell '" << spell.mId << "' has argument(s) present, dropping them.";
changed = true; changed = true;
} }
++iter;
} }
if (changed) if (changed)