From 01775dd6f05ddb81290d5d609d1aef7f2e348bee Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 4 Jun 2023 22:27:33 +0200 Subject: [PATCH 1/2] Try create CellStore for interior cell when not found --- apps/openmw/mwworld/worldmodel.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index 22860a175c..6e478b800f 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -175,12 +175,27 @@ namespace MWWorld CellStore* WorldModel::findInterior(std::string_view name, bool forceLoad) const { const auto it = mInteriors.find(name); + CellStore* cellStore = nullptr; + if (it == mInteriors.end()) - return nullptr; - assert(it->second != nullptr); - if (forceLoad && it->second->getState() != CellStore::State_Loaded) - it->second->load(); - return it->second; + { + if (const ESM::Cell* cell = mStore.get().search(name)) + cellStore = &emplaceCellStore(cell->mId, *cell, mStore, mReaders, mCells); + else if (const ESM4::Cell* cell4 = mStore.get().searchCellName(name)) + cellStore = &emplaceCellStore(cell4->mId, *cell4, mStore, mReaders, mCells); + else + return nullptr; + } + else + { + assert(it->second != nullptr); + cellStore = it->second; + } + + if (forceLoad && cellStore->getState() != CellStore::State_Loaded) + cellStore->load(); + + return cellStore; } CellStore& WorldModel::getInterior(std::string_view name, bool forceLoad) const From 457fa16e37114403ea7446c21fb3a217873a4ea2 Mon Sep 17 00:00:00 2001 From: elsid Date: Sun, 4 Jun 2023 22:27:33 +0200 Subject: [PATCH 2/2] Load existing exterior CellStore when required --- apps/openmw/mwworld/worldmodel.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index 6e478b800f..7f67ad6380 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -160,16 +160,26 @@ namespace MWWorld { CellStore& WorldModel::getExterior(ESM::ExteriorCellLocation location, bool forceLoad) const { - auto it = mExteriors.find(location); - if (it != mExteriors.end()) - return *it->second; - Cell cell = createExteriorCell(location, mStore); - const ESM::RefId id = cell.getId(); - CellStore& cellStore = emplaceCellStore(id, std::move(cell), mStore, mReaders, mCells); - mExteriors.emplace(location, &cellStore); - if (forceLoad && cellStore.getState() != CellStore::State_Loaded) - cellStore.load(); - return cellStore; + const auto it = mExteriors.find(location); + CellStore* cellStore = nullptr; + + if (it == mExteriors.end()) + { + Cell cell = createExteriorCell(location, mStore); + const ESM::RefId id = cell.getId(); + cellStore = &emplaceCellStore(id, std::move(cell), mStore, mReaders, mCells); + mExteriors.emplace(location, cellStore); + } + else + { + assert(it->second != nullptr); + cellStore = it->second; + } + + if (forceLoad && cellStore->getState() != CellStore::State_Loaded) + cellStore->load(); + + return *cellStore; } CellStore* WorldModel::findInterior(std::string_view name, bool forceLoad) const