mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-06 09:39:49 +00:00
Move reference to the right cell according to its geographical position
This commit is contained in:
parent
e073969fe1
commit
d0677c3f07
@ -434,6 +434,7 @@ namespace MWRender
|
||||
continue;
|
||||
|
||||
if (std::find(cell->mMovedRefs.begin(), cell->mMovedRefs.end(), ref.mRefNum) != cell->mMovedRefs.end()) continue;
|
||||
if (std::find(cell->mMovedRefsByPos.begin(), cell->mMovedRefsByPos.end(), ref.mRefNum) != cell->mMovedRefsByPos.end()) continue;
|
||||
Misc::StringUtils::lowerCaseInPlace(ref.mRefID);
|
||||
int type = store.findStatic(ref.mRefID);
|
||||
if (!typeFilter(type,size>=2)) continue;
|
||||
@ -455,6 +456,15 @@ namespace MWRender
|
||||
if (!typeFilter(type,size>=2)) continue;
|
||||
refs[ref.mRefNum] = std::move(ref);
|
||||
}
|
||||
|
||||
for (auto [ref, deleted] : cell->mLeasedRefsByPos)
|
||||
{
|
||||
if (deleted) { refs.erase(ref.mRefNum); continue; }
|
||||
Misc::StringUtils::lowerCaseInPlace(ref.mRefID);
|
||||
int type = store.findStatic(ref.mRefID);
|
||||
if (!typeFilter(type, size >= 2)) continue;
|
||||
refs[ref.mRefNum] = std::move(ref);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -478,6 +478,15 @@ namespace MWWorld
|
||||
// implementation when the oher implementation works as well.
|
||||
while (cell->getNextRef(esm, ref, deleted, cMRef, moved))
|
||||
{
|
||||
|
||||
auto x = static_cast<int>(std::floor(ref.mPos.pos[0] / float(ESM::Land::REAL_SIZE)));
|
||||
auto y = static_cast<int>(std::floor(ref.mPos.pos[1] / float(ESM::Land::REAL_SIZE)));
|
||||
if (x != cell->getGridX() || y != cell->getGridY())
|
||||
{
|
||||
ESM::Cell* cellAlt = const_cast<ESM::Cell*>(searchOrCreate(x, y));
|
||||
cellAlt->mLeasedRefsByPos.emplace_back(ref, deleted);
|
||||
cell->mMovedRefsByPos.push_back(ref.mRefNum);
|
||||
}
|
||||
if (!moved)
|
||||
continue;
|
||||
|
||||
@ -678,6 +687,9 @@ namespace MWWorld
|
||||
oldcell->mMovedRefs.push_back(*it);
|
||||
}
|
||||
|
||||
oldcell->mLeasedRefsByPos.splice(oldcell->mLeasedRefsByPos.end(), cell.mLeasedRefsByPos);
|
||||
oldcell->mMovedRefsByPos.splice(oldcell->mMovedRefsByPos.end(), cell.mMovedRefsByPos);
|
||||
|
||||
// We don't need to merge mLeasedRefs of cell / oldcell. This list is filled when another cell moves a
|
||||
// reference to this cell, so the list for the new cell should be empty. The list for oldcell,
|
||||
// however, could have leased refs in it and so should be kept.
|
||||
|
@ -124,6 +124,11 @@ struct Cell
|
||||
CellRefTracker mLeasedRefs;
|
||||
MovedCellRefTracker mMovedRefs;
|
||||
|
||||
// References "adopted" from another cell (i.e. a different cell
|
||||
// introduced this ref, and it has been moved here as it geographically in this cell)
|
||||
CellRefTracker mLeasedRefsByPos;
|
||||
std::list<RefNum> mMovedRefsByPos;
|
||||
|
||||
void postLoad(ESMReader &esm);
|
||||
|
||||
// This method is left in for compatibility with esmtool. Parsing moved references currently requires
|
||||
|
Loading…
x
Reference in New Issue
Block a user