1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-02 16:36:41 +00:00

Merge branch 'fix_find_cell' into 'master'

Fix finding interior and load exterior cells

See merge request OpenMW/openmw!3107
This commit is contained in:
psi29a 2023-06-05 07:19:25 +00:00
commit ceea726a50

View file

@ -160,27 +160,52 @@ namespace MWWorld
{ {
CellStore& WorldModel::getExterior(ESM::ExteriorCellLocation location, bool forceLoad) const CellStore& WorldModel::getExterior(ESM::ExteriorCellLocation location, bool forceLoad) const
{ {
auto it = mExteriors.find(location); const auto it = mExteriors.find(location);
if (it != mExteriors.end()) CellStore* cellStore = nullptr;
return *it->second;
Cell cell = createExteriorCell(location, mStore); if (it == mExteriors.end())
const ESM::RefId id = cell.getId(); {
CellStore& cellStore = emplaceCellStore(id, std::move(cell), mStore, mReaders, mCells); Cell cell = createExteriorCell(location, mStore);
mExteriors.emplace(location, &cellStore); const ESM::RefId id = cell.getId();
if (forceLoad && cellStore.getState() != CellStore::State_Loaded) cellStore = &emplaceCellStore(id, std::move(cell), mStore, mReaders, mCells);
cellStore.load(); mExteriors.emplace(location, cellStore);
return 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 CellStore* WorldModel::findInterior(std::string_view name, bool forceLoad) const
{ {
const auto it = mInteriors.find(name); const auto it = mInteriors.find(name);
CellStore* cellStore = nullptr;
if (it == mInteriors.end()) if (it == mInteriors.end())
return nullptr; {
assert(it->second != nullptr); if (const ESM::Cell* cell = mStore.get<ESM::Cell>().search(name))
if (forceLoad && it->second->getState() != CellStore::State_Loaded) cellStore = &emplaceCellStore(cell->mId, *cell, mStore, mReaders, mCells);
it->second->load(); else if (const ESM4::Cell* cell4 = mStore.get<ESM4::Cell>().searchCellName(name))
return it->second; 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 CellStore& WorldModel::getInterior(std::string_view name, bool forceLoad) const