fixed moved reference loading

moveref
Marc Zinnschlag 10 years ago
parent 89998a6a03
commit 7f905470fa

@ -21,7 +21,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
bool deleted = false; bool deleted = false;
while (ESM::Cell::getNextRef (reader, ref, deleted)) while (ESM::Cell::getNextRef (reader, ref, deleted, true))
{ {
// Keep mOriginalCell empty when in modified (as an indicator that the // Keep mOriginalCell empty when in modified (as an indicator that the
// original cell will always be equal the current cell). // original cell will always be equal the current cell).
@ -29,7 +29,6 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
if (cell.get().isExterior()) if (cell.get().isExterior())
{ {
// ignoring moved references sub-record; instead calculate cell from coordinates // ignoring moved references sub-record; instead calculate cell from coordinates
std::pair<int, int> index = ref.getCellIndex(); std::pair<int, int> index = ref.getCellIndex();

@ -25,7 +25,7 @@ void ESM::RefNum::save (ESMWriter &esm, bool wide, const std::string& tag) const
} }
void ESM::CellRef::load (ESMReader& esm, bool wideRefNum) void ESM::CellRef::load (ESMReader& esm, bool wideRefNum, bool ignoreRefNum)
{ {
// According to Hrnchamd, this does not belong to the actual ref. Instead, it is a marker indicating that // According to Hrnchamd, this does not belong to the actual ref. Instead, it is a marker indicating that
// the following refs are part of a "temp refs" section. A temp ref is not being tracked by the moved references system. // the following refs are part of a "temp refs" section. A temp ref is not being tracked by the moved references system.
@ -34,7 +34,8 @@ void ESM::CellRef::load (ESMReader& esm, bool wideRefNum)
if (esm.isNextSub ("NAM0")) if (esm.isNextSub ("NAM0"))
esm.skipHSub(); esm.skipHSub();
mRefNum.load (esm, wideRefNum); if (!ignoreRefNum)
mRefNum.load (esm, wideRefNum);
mRefID = esm.getHNString ("NAME"); mRefID = esm.getHNString ("NAME");

@ -168,7 +168,7 @@ std::string Cell::getDescription() const
} }
} }
bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted) bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted, bool ignoreMoves)
{ {
// TODO: Try and document reference numbering, I don't think this has been done anywhere else. // TODO: Try and document reference numbering, I don't think this has been done anywhere else.
if (!esm.hasMoreSubs()) if (!esm.hasMoreSubs())
@ -176,10 +176,20 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref, bool& deleted)
// NOTE: We should not need this check. It is a safety check until we have checked // NOTE: We should not need this check. It is a safety check until we have checked
// more plugins, and how they treat these moved references. // more plugins, and how they treat these moved references.
if (esm.isNextSub("MVRF")) { if (esm.isNextSub("MVRF"))
// skip rest of cell record (moved references), they are handled elsewhere {
esm.skipRecord(); // skip MVRF, CNDT if (ignoreMoves)
return false; {
MovedCellRef mref;
esm.getHT (mref.mRefNum.mIndex);
esm.getHNOT (mref.mTarget, "CNDT");
}
else
{
// skip rest of cell record (moved references), they are handled elsewhere
esm.skipRecord(); // skip MVRF, CNDT
return false;
}
} }
ref.load (esm); ref.load (esm);

@ -156,7 +156,8 @@ struct Cell
All fields of the CellRef struct are overwritten. You can safely All fields of the CellRef struct are overwritten. You can safely
reuse one memory location without blanking it between calls. reuse one memory location without blanking it between calls.
*/ */
static bool getNextRef(ESMReader &esm, CellRef &ref, bool& deleted); /// \param ignoreMoves ignore MVRF record and read reference like a regular CellRef.
static bool getNextRef(ESMReader &esm, CellRef &ref, bool& deleted, bool ignoreMoves = false);
/* This fetches an MVRF record, which is used to track moved references. /* This fetches an MVRF record, which is used to track moved references.
* Since they are comparably rare, we use a separate method for this. * Since they are comparably rare, we use a separate method for this.

Loading…
Cancel
Save