1
0
mirror of https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git synced 2025-07-18 19:29:09 +00:00
plRegistryKeyList::Read assumed that plUoid object IDs are always
sequential. This is not the case since f664e8b resulted in all keys
getting an ID. The problem manifested itself here because there were
temporary materials that were being created and thrown away, causing
object ID gaps.
This commit is contained in:
2014-01-05 22:39:00 -05:00
parent b8d0b9ab8b
commit e48a4767cf

View File

@ -52,7 +52,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
plRegistryKeyList::~plRegistryKeyList()
{
std::for_each(fKeys.begin(), fKeys.end(),
[] (plKeyImp* key) { if (!key->ObjectIsLoaded()) delete key; }
[] (plKeyImp* key) { if (key && !key->ObjectIsLoaded()) delete key; }
);
}
@ -85,7 +85,7 @@ plKeyImp* plRegistryKeyList::FindKey(const plUoid& uoid) const
// because of local data. Verify that we have the right key by
// name, and if it's wrong, do the slower find-by-name.
plKeyImp *keyImp = fKeys[objectID-1];
if (keyImp->GetName().CompareI(uoid.GetObjectName()) != 0)
if (!keyImp || keyImp->GetName().CompareI(uoid.GetObjectName()) != 0)
return FindKey(uoid.GetObjectName());
else
return keyImp;
@ -172,8 +172,9 @@ bool plRegistryKeyList::SetKeyUnused(plKeyImp* key, LoadStatus& loadStatusChange
// Recall that vectors are index zero but normal object IDs are index one...
else if (id <= fKeys.size()) {
if (fKeys[id-1]->GetUoid().GetObjectID() == id)
foundKey = fKeys[id-1];
plKeyImp* tempKey = fKeys[id-1];
if (tempKey && tempKey->GetUoid().GetObjectID() == id)
foundKey = tempKey;
}
// Last chance: do a slow name search for that key.
@ -203,14 +204,19 @@ void plRegistryKeyList::Read(hsStream* s)
s->ReadByte();
uint32_t numKeys = s->ReadLE32();
fKeys.reserve(numKeys);
fKeys.reserve((numKeys * 3) / 2);
for (uint32_t i = 0; i < numKeys; ++i)
{
plKeyImp* newKey = new plKeyImp;
newKey->Read(s);
fKeys.push_back(newKey);
uint32_t id = newKey->GetUoid().GetObjectID();
if (fKeys.size() < id)
fKeys.resize(id);
fKeys[id - 1] = newKey;
}
fKeys.shrink_to_fit();
}
void plRegistryKeyList::Write(hsStream* s)
@ -229,7 +235,7 @@ void plRegistryKeyList::Write(hsStream* s)
for (auto it = fKeys.begin(); it != fKeys.end(); ++it)
{
plKeyImp* key = *it;
if (key->ObjectIsLoaded())
if (key && key->ObjectIsLoaded())
{
++keyCount;
key->Write(s);