mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-25 03:40:40 +00:00
Merge branch 'OpenMW_Bug6067' into 'master'
Support moved references records in any order. (Issue #6067) See merge request OpenMW/openmw!982
This commit is contained in:
commit
3588bfcb17
@ -496,20 +496,28 @@ namespace MWWorld
|
||||
}
|
||||
return search(cell.mName);
|
||||
}
|
||||
|
||||
// this method *must* be called right after esm.loadCell()
|
||||
void Store<ESM::Cell>::handleMovedCellRefs(ESM::ESMReader& esm, ESM::Cell* cell)
|
||||
{
|
||||
//Handling MovedCellRefs, there is no way to do it inside loadcell
|
||||
while (esm.isNextSub("MVRF")) {
|
||||
ESM::CellRef ref;
|
||||
ESM::MovedCellRef cMRef;
|
||||
cell->getNextMVRF(esm, cMRef);
|
||||
cMRef.mRefNum.mIndex = 0;
|
||||
bool deleted = false;
|
||||
|
||||
ESM::Cell *cellAlt = const_cast<ESM::Cell*>(searchOrCreate(cMRef.mTarget[0], cMRef.mTarget[1]));
|
||||
ESM::ESM_Context ctx = esm.getContext();
|
||||
|
||||
// Handling MovedCellRefs, there is no way to do it inside loadcell
|
||||
// TODO: verify above comment
|
||||
//
|
||||
// Get regular moved reference data. Adapted from CellStore::loadRefs. Maybe we can optimize the following
|
||||
// implementation when the oher implementation works as well.
|
||||
bool deleted = false;
|
||||
cell->getNextRef(esm, ref, deleted);
|
||||
while (cell->getNextRef(esm, ref, deleted, /*ignoreMoves*/true, &cMRef))
|
||||
{
|
||||
if (!cMRef.mRefNum.mIndex)
|
||||
continue; // ignore refs that are not moved
|
||||
|
||||
ESM::Cell *cellAlt = const_cast<ESM::Cell*>(searchOrCreate(cMRef.mTarget[0], cMRef.mTarget[1]));
|
||||
|
||||
// Add data required to make reference appear in the correct cell.
|
||||
// We should not need to test for duplicates, as this part of the code is pre-cell merge.
|
||||
@ -521,7 +529,11 @@ namespace MWWorld
|
||||
cellAlt->mLeasedRefs.emplace_back(std::move(ref), deleted);
|
||||
else
|
||||
*iter = std::make_pair(std::move(ref), deleted);
|
||||
|
||||
cMRef.mRefNum.mIndex = 0;
|
||||
}
|
||||
|
||||
esm.restoreContext(ctx);
|
||||
}
|
||||
const ESM::Cell *Store<ESM::Cell>::search(const std::string &id) const
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user