mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-03 09:19:41 +00:00
fixed moved reference loading
This commit is contained in:
parent
89998a6a03
commit
7f905470fa
4 changed files with 21 additions and 10 deletions
|
@ -21,7 +21,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
|||
|
||||
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
|
||||
// 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())
|
||||
{
|
||||
|
||||
// ignoring moved references sub-record; instead calculate cell from coordinates
|
||||
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
|
||||
// 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"))
|
||||
esm.skipHSub();
|
||||
|
||||
mRefNum.load (esm, wideRefNum);
|
||||
if (!ignoreRefNum)
|
||||
mRefNum.load (esm, wideRefNum);
|
||||
|
||||
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.
|
||||
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
|
||||
// more plugins, and how they treat these moved references.
|
||||
if (esm.isNextSub("MVRF")) {
|
||||
// skip rest of cell record (moved references), they are handled elsewhere
|
||||
esm.skipRecord(); // skip MVRF, CNDT
|
||||
return false;
|
||||
if (esm.isNextSub("MVRF"))
|
||||
{
|
||||
if (ignoreMoves)
|
||||
{
|
||||
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);
|
||||
|
|
|
@ -156,7 +156,8 @@ struct Cell
|
|||
All fields of the CellRef struct are overwritten. You can safely
|
||||
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.
|
||||
* Since they are comparably rare, we use a separate method for this.
|
||||
|
|
Loading…
Reference in a new issue