From f800f63ee54c35e152d4664446a169f880c6d2db Mon Sep 17 00:00:00 2001 From: elsid Date: Sat, 8 Mar 2025 12:47:07 +0100 Subject: [PATCH] Merge deleted refs when unloading a cell To unload objects scheduled to be teleported. --- apps/openmw/mwworld/cellstore.cpp | 18 +++++++++--------- apps/openmw/mwworld/cellstore.hpp | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 4cd189bb20..fca0135e13 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -337,13 +337,13 @@ namespace // helper function for forEachInternal template - bool forEachImp(Visitor& visitor, List& list, MWWorld::CellStore* cellStore) + bool forEachImp(Visitor& visitor, List& list, MWWorld::CellStore& cellStore, bool includeDeleted) { - for (typename List::List::iterator iter(list.mList.begin()); iter != list.mList.end(); ++iter) + for (auto& v : list.mList) { - if (!MWWorld::CellStore::isAccessible(iter->mData, iter->mRef)) + if (!includeDeleted && !MWWorld::CellStore::isAccessible(v.mData, v.mRef)) continue; - if (!visitor(MWWorld::Ptr(&*iter, cellStore))) + if (!visitor(MWWorld::Ptr(&v, &cellStore))) return false; } return true; @@ -399,12 +399,12 @@ namespace MWWorld // listing only objects owned by this cell. Internal use only, you probably want to use forEach() so that moved // objects are accounted for. template - static bool forEachInternal(Visitor& visitor, MWWorld::CellStore& cellStore) + static bool forEachInternal(Visitor& visitor, MWWorld::CellStore& cellStore, bool includeDeleted) { bool returnValue = true; - Misc::tupleForEach(cellStore.mCellStoreImp->mRefLists, [&visitor, &returnValue, &cellStore](auto& store) { - returnValue = returnValue && forEachImp(visitor, store, &cellStore); + Misc::tupleForEach(cellStore.mCellStoreImp->mRefLists, [&](auto& store) { + returnValue = returnValue && forEachImp(visitor, store, cellStore, includeDeleted); }); return returnValue; @@ -583,11 +583,11 @@ namespace MWWorld mMergedRefsNeedsUpdate = true; } - void CellStore::updateMergedRefs() const + void CellStore::updateMergedRefs(bool includeDeleted) const { mMergedRefs.clear(); MergeVisitor visitor(mMergedRefs, mMovedHere, mMovedToAnotherCell); - CellStoreImp::forEachInternal(visitor, const_cast(*this)); + CellStoreImp::forEachInternal(visitor, const_cast(*this), includeDeleted); visitor.merge(); mMergedRefsNeedsUpdate = false; } diff --git a/apps/openmw/mwworld/cellstore.hpp b/apps/openmw/mwworld/cellstore.hpp index 2cc9b106a6..126935ace5 100644 --- a/apps/openmw/mwworld/cellstore.hpp +++ b/apps/openmw/mwworld/cellstore.hpp @@ -219,7 +219,7 @@ namespace MWWorld return false; if (mMergedRefsNeedsUpdate) - updateMergedRefs(); + updateMergedRefs(includeDeleted); if (mMergedRefs.empty()) return true; @@ -248,7 +248,7 @@ namespace MWWorld return false; if (mMergedRefsNeedsUpdate) - updateMergedRefs(); + updateMergedRefs(includeDeleted); for (const LiveCellRefBase* mergedRef : mMergedRefs) { @@ -273,7 +273,7 @@ namespace MWWorld return false; if (mMergedRefsNeedsUpdate) - updateMergedRefs(); + updateMergedRefs(includeDeleted); if (mMergedRefs.empty()) return true; @@ -403,7 +403,7 @@ namespace MWWorld /// Repopulate mMergedRefs. void requestMergedRefsUpdate(); - void updateMergedRefs() const; + void updateMergedRefs(bool includeDeleted = false) const; // (item, max charge) typedef std::vector> TRechargingItems;