diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index 3841cc6fdf..4f430658c2 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -17,50 +17,6 @@ #include "cellstore.hpp" #include "esmstore.hpp" -namespace -{ - template - bool forEachInStore( - const ESM::RefId& id, Visitor&& visitor, std::unordered_map& cellStore) - { - for (auto& cell : cellStore) - { - if (cell.second.getState() == MWWorld::CellStore::State_Unloaded) - cell.second.preload(); - if (cell.second.getState() == MWWorld::CellStore::State_Preloaded) - { - if (cell.second.hasId(id)) - { - cell.second.load(); - } - else - continue; - } - bool cont = cell.second.forEach([&](MWWorld::Ptr ptr) { - if (ptr.getCellRef().getRefId() == id) - { - return visitor(ptr); - } - return true; - }); - if (!cont) - return false; - } - return true; - } - - struct PtrCollector - { - std::vector mPtrs; - - bool operator()(MWWorld::Ptr ptr) - { - mPtrs.emplace_back(ptr); - return true; - } - }; -} - MWWorld::CellStore& MWWorld::WorldModel::getOrInsertCellStore(const ESM::Cell& cell) { const auto it = mCells.find(cell.mId); @@ -369,9 +325,24 @@ void MWWorld::WorldModel::getExteriorPtrs(const ESM::RefId& name, std::vector MWWorld::WorldModel::getAll(const ESM::RefId& id) { - PtrCollector visitor; - forEachInStore(id, visitor, mCells); - return visitor.mPtrs; + std::vector result; + for (auto& [cellId, cellStore] : mCells) + { + if (cellStore.getState() == CellStore::State_Unloaded) + cellStore.preload(); + if (cellStore.getState() == CellStore::State_Preloaded) + { + if (!cellStore.hasId(id)) + continue; + cellStore.load(); + } + cellStore.forEach([&](const Ptr& ptr) { + if (ptr.getCellRef().getRefId() == id) + result.push_back(ptr); + return true; + }); + } + return result; } int MWWorld::WorldModel::countSavedGameRecords() const