diff --git a/apps/openmw/mwworld/worldmodel.cpp b/apps/openmw/mwworld/worldmodel.cpp index 22860a175c..7f67ad6380 100644 --- a/apps/openmw/mwworld/worldmodel.cpp +++ b/apps/openmw/mwworld/worldmodel.cpp @@ -160,27 +160,52 @@ 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 { 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