From 19df671bba435f36ba6aa753e1b83744f582c89c Mon Sep 17 00:00:00 2001 From: psi29a Date: Sun, 21 Aug 2022 12:03:43 +0000 Subject: [PATCH] Merge branch 'effect_indices' into 'master' Preserve effect indices when applying AoE and targeted spells Closes #6957 See merge request OpenMW/openmw!2315 (cherry picked from commit 5ed9764f3be47fba2d3097bd9d016863b56f88ab) a5476082 Preserve effect indices when applying AoE and targeted spells --- apps/openmw/mwworld/projectilemanager.cpp | 10 ++++++++-- apps/openmw/mwworld/worldimp.cpp | 12 +++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) 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); } }