1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-03-14 01:19:59 +00:00

Merge branch 'fix_lua_teleport' into 'master'

Merge deleted refs when unloading a cell (#8311)

Closes #8311

See merge request OpenMW/openmw!4575
This commit is contained in:
Alexei Kotov 2025-03-09 15:51:01 +03:00
commit a49a900a7b
2 changed files with 13 additions and 13 deletions

View File

@ -337,13 +337,13 @@ namespace
// helper function for forEachInternal
template <class Visitor, class List>
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 <class Visitor>
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<CellStore&>(*this));
CellStoreImp::forEachInternal(visitor, const_cast<CellStore&>(*this), includeDeleted);
visitor.merge();
mMergedRefsNeedsUpdate = false;
}

View File

@ -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<std::pair<LiveCellRefBase*, float>> TRechargingItems;