diff --git a/apps/openmw/mwworld/projectilemanager.cpp b/apps/openmw/mwworld/projectilemanager.cpp index 3894569682..e610dda19f 100644 --- a/apps/openmw/mwworld/projectilemanager.cpp +++ b/apps/openmw/mwworld/projectilemanager.cpp @@ -539,6 +539,7 @@ namespace MWWorld MWMechanics::projectileHit(caster, target, bow, projectileRef.getPtr(), pos, projectileState.mAttackStrength); projectileState.mToDelete = true; } + const MWWorld::ESMStore& esmStore = MWBase::Environment::get().getWorld()->getStore(); for (auto& magicBoltState : mMagicBolts) { if (magicBoltState.mToDelete) @@ -563,9 +564,14 @@ namespace MWWorld cast.mId = magicBoltState.mSpellId; cast.mSourceName = magicBoltState.mSourceName; cast.mSlot = magicBoltState.mSlot; - cast.inflict(target, caster, magicBoltState.mEffects, ESM::RT_Target, true); + // Grab original effect list so the indices are correct + const ESM::EffectList* effects; + if (const ESM::Spell* spell = esmStore.get().search(magicBoltState.mSpellId)) + effects = &spell->mEffects; + else + effects = &esmStore.get().find(magicBoltState.mSpellId)->mEffects; + cast.inflict(target, caster, *effects, ESM::RT_Target); - MWBase::Environment::get().getWorld()->explodeSpell(pos, magicBoltState.mEffects, caster, target, ESM::RT_Target, magicBoltState.mSpellId, magicBoltState.mSourceName, false, magicBoltState.mSlot); magicBoltState.mToDelete = true; } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 12df39fb28..0d1b5662c0 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -3730,8 +3730,10 @@ namespace MWWorld const std::string& id, const std::string& sourceName, const bool fromProjectile, int slot) { std::map > toApply; + int index = -1; for (const ESM::ENAMstruct& effectInfo : effects.mList) { + ++index; const ESM::MagicEffect* effect = mStore.get().find(effectInfo.mEffectID); if (effectInfo.mRange != rangeType || (effectInfo.mArea <= 0 && !ignore.isEmpty() && ignore.getClass().isActor())) @@ -3786,7 +3788,15 @@ namespace MWWorld if (affected.getClass().isActor() && !isActorCollisionEnabled(affected)) continue; - toApply[affected].push_back(effectInfo); + auto& list = toApply[affected]; + while (list.size() < static_cast(index)) + { + // Insert dummy effects to preserve indices + auto& dummy = list.emplace_back(effectInfo); + dummy.mRange = ESM::RT_Self; + assert(dummy.mRange != rangeType); + } + list.push_back(effectInfo); } }