1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-18 19:16:37 +00:00

FIX: Track the highest local refNum during plugin loading and increment it for each cloned/created reference

This commit is contained in:
Dave Corley 2025-07-13 05:12:42 -07:00
parent 2cb7d6c392
commit 79d86bf2bd
2 changed files with 14 additions and 3 deletions

View file

@ -175,6 +175,9 @@ void CSMWorld::RefCollection::load(ESM::ESMReader& reader, int cellIndex, bool b
ref.mIdNum = mNextId; // FIXME: fragile ref.mIdNum = mNextId; // FIXME: fragile
ref.mId = ESM::RefId::stringRefId(getNewId()); ref.mId = ESM::RefId::stringRefId(getNewId());
if (!base && ref.mRefNum.mIndex >= mHighestUsedRefNum)
mHighestUsedRefNum = ref.mRefNum.mIndex;
cache.emplace(ref.mRefNum, ref.mIdNum); cache.emplace(ref.mRefNum, ref.mIdNum);
auto record = std::make_unique<Record<CellRef>>(); auto record = std::make_unique<Record<CellRef>>();
@ -222,6 +225,11 @@ std::string CSMWorld::RefCollection::getNewId()
return "ref#" + std::to_string(mNextId++); return "ref#" + std::to_string(mNextId++);
} }
uint32_t CSMWorld::RefCollection::getNextRefNum()
{
return ++mHighestUsedRefNum;
}
unsigned int CSMWorld::RefCollection::extractIdNum(std::string_view id) const unsigned int CSMWorld::RefCollection::extractIdNum(std::string_view id) const
{ {
std::string::size_type separator = id.find_last_of('#'); std::string::size_type separator = id.find_last_of('#');
@ -283,6 +291,7 @@ void CSMWorld::RefCollection::appendBlankRecord(const ESM::RefId& id, UniversalI
record->get().mId = id; record->get().mId = id;
record->get().mIdNum = extractIdNum(id.getRefIdString()); record->get().mIdNum = extractIdNum(id.getRefIdString());
record->get().mRefNum.mIndex = getNextRefNum();
Collection<CellRef>::appendRecord(std::move(record)); Collection<CellRef>::appendRecord(std::move(record));
} }
@ -298,15 +307,13 @@ void CSMWorld::RefCollection::cloneRecord(
copy->get().mId = destination; copy->get().mId = destination;
copy->get().mIdNum = extractIdNum(destination.getRefIdString()); copy->get().mIdNum = extractIdNum(destination.getRefIdString());
copy->get().mRefNum.mIndex = getNextRefNum();
if (copy->get().mRefNum.hasContentFile()) if (copy->get().mRefNum.hasContentFile())
{ {
mRefIndex.insert(std::make_pair(static_cast<Record<CellRef>*>(copy.get())->get().mIdNum, index)); mRefIndex.insert(std::make_pair(static_cast<Record<CellRef>*>(copy.get())->get().mIdNum, index));
copy->get().mRefNum.mContentFile = -1; copy->get().mRefNum.mContentFile = -1;
copy->get().mRefNum.mIndex = index;
} }
else
copy->get().mRefNum.mIndex = copy->get().mIdNum;
insertRecord(std::move(copy), getAppendIndex(destination, type)); // call RefCollection::insertRecord() insertRecord(std::move(copy), getAppendIndex(destination, type)); // call RefCollection::insertRecord()
} }

View file

@ -1,6 +1,7 @@
#ifndef CSM_WOLRD_REFCOLLECTION_H #ifndef CSM_WOLRD_REFCOLLECTION_H
#define CSM_WOLRD_REFCOLLECTION_H #define CSM_WOLRD_REFCOLLECTION_H
#include <cstdint>
#include <map> #include <map>
#include <memory> #include <memory>
#include <string> #include <string>
@ -40,9 +41,12 @@ namespace CSMWorld
std::map<unsigned int, int> mRefIndex; // CellRef index keyed by CSMWorld::CellRef::mIdNum std::map<unsigned int, int> mRefIndex; // CellRef index keyed by CSMWorld::CellRef::mIdNum
int mNextId; int mNextId;
uint32_t mHighestUsedRefNum = 0;
unsigned int extractIdNum(std::string_view id) const; unsigned int extractIdNum(std::string_view id) const;
uint32_t getNextRefNum();
int getIntIndex(unsigned int id) const; int getIntIndex(unsigned int id) const;
int searchId(unsigned int id) const; int searchId(unsigned int id) const;