diff --git a/apps/openmw/mwworld/projectilemanager.cpp b/apps/openmw/mwworld/projectilemanager.cpp index c886908f9..55ecdb569 100644 --- a/apps/openmw/mwworld/projectilemanager.cpp +++ b/apps/openmw/mwworld/projectilemanager.cpp @@ -6,6 +6,7 @@ #include "../mwworld/manualref.hpp" #include "../mwworld/class.hpp" +#include "../mwworld/inventorystore.hpp" #include "../mwbase/soundmanager.hpp" #include "../mwbase/world.hpp" @@ -96,7 +97,7 @@ namespace MWWorld { ProjectileState state; state.mActorId = actor.getClass().getCreatureStats(actor).getActorId(); - state.mBow = bow; + state.mBowId = bow.getCellRef().mRefID; state.mVelocity = orient.yAxis() * speed; state.mProjectileId = projectile.getCellRef().mRefID; @@ -217,17 +218,28 @@ namespace MWWorld if (obstacle == caster) continue; - if (caster.isEmpty()) - caster = obstacle; - if (obstacle.isEmpty()) { // Terrain } else if (obstacle.getClass().isActor()) - { + { MWWorld::ManualRef projectileRef(MWBase::Environment::get().getWorld()->getStore(), it->mProjectileId); - MWMechanics::projectileHit(caster, obstacle, it->mBow, projectileRef.getPtr(), pos + (newPos - pos) * cIt->first); + + // Try to get a Ptr to the bow that was used. It might no longer exist. + MWWorld::Ptr bow = projectileRef.getPtr(); + if (!caster.isEmpty()) + { + MWWorld::InventoryStore& inv = caster.getClass().getInventoryStore(caster); + MWWorld::ContainerStoreIterator invIt = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedRight); + if (invIt != inv.end() && Misc::StringUtils::ciEqual(invIt->getCellRef().mRefID, it->mBowId)) + bow = *invIt; + } + + if (caster.isEmpty()) + caster = obstacle; + + MWMechanics::projectileHit(caster, obstacle, bow, projectileRef.getPtr(), pos + (newPos - pos) * cIt->first); } hit = true; } diff --git a/apps/openmw/mwworld/projectilemanager.hpp b/apps/openmw/mwworld/projectilemanager.hpp index e934bf6ab..c51985a7e 100644 --- a/apps/openmw/mwworld/projectilemanager.hpp +++ b/apps/openmw/mwworld/projectilemanager.hpp @@ -84,7 +84,8 @@ namespace MWWorld // RefID of the projectile std::string mProjectileId; - MWWorld::Ptr mBow; // bow or crossbow the projectile was fired from (may be empty) + // RefID of the bow or crossbow the actor was using when this projectile was fired (may be empty) + std::string mBowId; Ogre::Vector3 mVelocity; };