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:
commit
ceea726a50
1 changed files with 40 additions and 15 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue