diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index dcf0d7ca99..d6ec6e810c 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -2163,27 +2163,38 @@ namespace MWWorld btVector3 from(pos.x, pos.y, pos.z); btVector3 to(newPos.x, newPos.y, newPos.z); std::vector > collisions = mPhysEngine->rayTest2(from, to); - for (std::vector >::iterator cIt = collisions.begin(); cIt != collisions.end(); ++cIt) + bool explode = false; + for (std::vector >::iterator cIt = collisions.begin(); cIt != collisions.end() && !explode; ++cIt) { MWWorld::Ptr obstacle = searchPtrViaHandle(cIt->second); - if (obstacle.isEmpty()) - { - // Terrain. TODO: Explode - continue; - } if (obstacle == ptr) continue; + + explode = true; + MWWorld::Ptr caster = searchPtrViaHandle(it->second.mActorHandle); if (caster.isEmpty()) caster = obstacle; - MWMechanics::CastSpell cast(caster, obstacle); - cast.mStack = it->second.mStack; - cast.mId = it->second.mId; - cast.mSourceName = it->second.mSourceName; - cast.inflict(obstacle, caster, it->second.mEffects, ESM::RT_Target, false); + if (obstacle.isEmpty()) + { + // Terrain + } + else + { + MWMechanics::CastSpell cast(caster, obstacle); + cast.mStack = it->second.mStack; + cast.mId = it->second.mId; + cast.mSourceName = it->second.mSourceName; + cast.inflict(obstacle, caster, it->second.mEffects, ESM::RT_Target, false); + } deleteObject(ptr); mProjectiles.erase(it++); + } + + if (explode) + { + // TODO: Explode continue; }