From 6b5d9f334400ad188a9da0e251cbefae5f1bdb0a Mon Sep 17 00:00:00 2001 From: "florent.teppe" Date: Wed, 19 Apr 2023 11:49:54 +0200 Subject: [PATCH] fixes reference saving stage --- apps/opencs/model/doc/savingstages.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/opencs/model/doc/savingstages.cpp b/apps/opencs/model/doc/savingstages.cpp index 4015a4b8bf..c4269670b2 100644 --- a/apps/opencs/model/doc/savingstages.cpp +++ b/apps/opencs/model/doc/savingstages.cpp @@ -256,25 +256,17 @@ void CSMDoc::CollectionReferencesStage::perform(int stage, Messages& messages) if (record.isModified() || record.mState == CSMWorld::RecordBase::State_Deleted) { - const ESM::RefId& cellId + const ESM::RefId cellId = record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell; std::deque& indices = mState.getOrInsertSubRecord(cellId); // collect moved references at the end of the container - const bool interior = !cellId.startsWith("#"); - std::ostringstream stream; - if (!interior) - { - // recalculate the ref's cell location - std::pair index = record.get().getCellIndex(); - stream << "#" << index.first << " " << index.second; - } + const bool interior = !cellId.is(); // An empty mOriginalCell is meant to indicate that it is the same as // the current cell. It is possible that a moved ref is moved again. - if ((record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell) - != ESM::RefId::stringRefId(stream.str()) + if ((record.get().mOriginalCell.empty() ? record.get().mCell : record.get().mOriginalCell) != cellId && !interior && record.mState != CSMWorld::RecordBase::State_ModifiedOnly && !record.get().mNew) indices.push_back(i); else @@ -359,7 +351,7 @@ void CSMDoc::WriteCellCollectionStage::perform(int stage, Messages& messages) std::deque tempRefs; std::deque persistentRefs; - const std::deque* references = mState.findSubRecord(cell.get().mId); + const std::deque* references = mState.findSubRecord(static_cast(cell.get()).mId); if (cell.isModified() || cell.mState == CSMWorld::RecordBase::State_Deleted || references != nullptr) {