diff --git a/apps/opencs/model/tools/referencecheck.cpp b/apps/opencs/model/tools/referencecheck.cpp index 33c2168ef3..306094f2f5 100644 --- a/apps/opencs/model/tools/referencecheck.cpp +++ b/apps/opencs/model/tools/referencecheck.cpp @@ -45,6 +45,16 @@ void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages& message const CSMWorld::CellRef& cellRef = record.get(); const CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Reference, cellRef.mId); + // Check RefNum is unique per content file, otherwise can cause load issues + const auto refNum = cellRef.mRefNum; + const auto insertResult = mUsedReferenceIDs.emplace(refNum, cellRef.mId); + if (!insertResult.second) + messages.add(id, + "Duplicate RefNum: " + std::to_string(refNum.mContentFile) + std::string("-") + + std::to_string(refNum.mIndex) + " shared with cell reference " + + insertResult.first->second.toString(), + "", CSMDoc::Message::Severity_Error); + // Check reference id if (cellRef.mRefID.empty()) messages.add(id, "Instance is not based on an object", "", CSMDoc::Message::Severity_Error); @@ -109,6 +119,7 @@ void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages& message int CSMTools::ReferenceCheckStage::setup() { mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + mUsedReferenceIDs.clear(); return mReferences.getSize(); } diff --git a/apps/opencs/model/tools/referencecheck.hpp b/apps/opencs/model/tools/referencecheck.hpp index 5f5004b912..58fb4e4170 100644 --- a/apps/opencs/model/tools/referencecheck.hpp +++ b/apps/opencs/model/tools/referencecheck.hpp @@ -43,6 +43,7 @@ namespace CSMTools const CSMWorld::IdCollection<CSMWorld::Cell>& mCells; const CSMWorld::IdCollection<ESM::Faction>& mFactions; const CSMWorld::IdCollection<ESM::BodyPart>& mBodyParts; + std::unordered_map<ESM::RefNum, ESM::RefId> mUsedReferenceIDs; bool mIgnoreBaseRecords; }; }