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:
commit
a49a900a7b
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user