diff --git a/apps/openmw/mwworld/cellstore.hpp b/apps/openmw/mwworld/cellstore.hpp index 097053e2e0..2cc9b106a6 100644 --- a/apps/openmw/mwworld/cellstore.hpp +++ b/apps/openmw/mwworld/cellstore.hpp @@ -213,7 +213,7 @@ namespace MWWorld /// unintended behaviour. \attention This function also lists deleted (count 0) objects! /// \return Iteration completed? template - bool forEach(Visitor&& visitor) + bool forEach(Visitor&& visitor, bool includeDeleted = false) { if (mState != State_Loaded) return false; @@ -227,7 +227,7 @@ namespace MWWorld for (LiveCellRefBase* mergedRef : mMergedRefs) { - if (!isAccessible(mergedRef->mData, mergedRef->mRef)) + if (!includeDeleted && !isAccessible(mergedRef->mData, mergedRef->mRef)) continue; if (!visitor(MWWorld::Ptr(mergedRef, this))) @@ -242,7 +242,7 @@ namespace MWWorld /// unintended behaviour. \attention This function also lists deleted (count 0) objects! /// \return Iteration completed? template - bool forEachConst(Visitor&& visitor) const + bool forEachConst(Visitor&& visitor, bool includeDeleted = false) const { if (mState != State_Loaded) return false; @@ -252,7 +252,7 @@ namespace MWWorld for (const LiveCellRefBase* mergedRef : mMergedRefs) { - if (!isAccessible(mergedRef->mData, mergedRef->mRef)) + if (!includeDeleted && !isAccessible(mergedRef->mData, mergedRef->mRef)) continue; if (!visitor(MWWorld::ConstPtr(mergedRef, this))) @@ -267,7 +267,7 @@ namespace MWWorld /// unintended behaviour. \attention This function also lists deleted (count 0) objects! /// \return Iteration completed? template - bool forEachType(Visitor&& visitor) + bool forEachType(Visitor&& visitor, bool includeDeleted = false) { if (mState != State_Loaded) return false; @@ -279,16 +279,13 @@ namespace MWWorld mHasState = true; - CellRefList& list = get(); - - for (typename CellRefList::List::iterator it(list.mList.begin()); it != list.mList.end(); ++it) + for (LiveCellRefBase& base : get().mList) { - LiveCellRefBase* base = &*it; - if (mMovedToAnotherCell.find(base) != mMovedToAnotherCell.end()) + if (mMovedToAnotherCell.contains(&base)) continue; - if (!isAccessible(base->mData, base->mRef)) + if (!includeDeleted && !isAccessible(base.mData, base.mRef)) continue; - if (!visitor(MWWorld::Ptr(base, this))) + if (!visitor(MWWorld::Ptr(&base, this))) return false; } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index c30c2b5af0..fb3aee958c 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -367,7 +367,7 @@ namespace MWWorld ListAndResetObjectsVisitor visitor; - cell->forEach(visitor); + cell->forEach(visitor, true); // Include objects being teleported by Lua for (const auto& ptr : visitor.mObjects) { if (const auto object = mPhysics->getObject(ptr))