1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-05 19:45:33 +00:00

Disallow inserting containers, creatures, and npcs from the save game not present in content files

This commit is contained in:
Evil Eye 2021-03-22 22:29:10 +01:00
parent f089c94d34
commit 5e1960a76a
3 changed files with 16 additions and 8 deletions

View file

@ -384,12 +384,14 @@ void ESMStore::validate()
case ESM::REC_ENCH: case ESM::REC_ENCH:
case ESM::REC_SPEL: case ESM::REC_SPEL:
case ESM::REC_WEAP: case ESM::REC_WEAP:
case ESM::REC_NPC_:
case ESM::REC_LEVI: case ESM::REC_LEVI:
case ESM::REC_LEVC: case ESM::REC_LEVC:
mStores[type]->read (reader);
return true;
case ESM::REC_NPC_:
case ESM::REC_CREA: case ESM::REC_CREA:
case ESM::REC_CONT: case ESM::REC_CONT:
mStores[type]->read (reader); mStores[type]->read (reader, true);
return true; return true;
case ESM::REC_DYNA: case ESM::REC_DYNA:

View file

@ -250,9 +250,15 @@ namespace MWWorld
} }
} }
template<typename T> template<typename T>
T *Store<T>::insert(const T &item) T *Store<T>::insert(const T &item, bool overrideOnly)
{ {
std::string id = Misc::StringUtils::lowerCase(item.mId); std::string id = Misc::StringUtils::lowerCase(item.mId);
if(overrideOnly)
{
auto it = mStatic.find(id);
if(it == mStatic.end())
return nullptr;
}
std::pair<typename Dynamic::iterator, bool> result = std::pair<typename Dynamic::iterator, bool> result =
mDynamic.insert(std::pair<std::string, T>(id, item)); mDynamic.insert(std::pair<std::string, T>(id, item));
T *ptr = &result.first->second; T *ptr = &result.first->second;
@ -337,13 +343,13 @@ namespace MWWorld
} }
} }
template<typename T> template<typename T>
RecordId Store<T>::read(ESM::ESMReader& reader) RecordId Store<T>::read(ESM::ESMReader& reader, bool overrideOnly)
{ {
T record; T record;
bool isDeleted = false; bool isDeleted = false;
record.load (reader, isDeleted); record.load (reader, isDeleted);
insert (record); insert (record, overrideOnly);
return RecordId(record.mId, isDeleted); return RecordId(record.mId, isDeleted);
} }

View file

@ -46,7 +46,7 @@ namespace MWWorld
virtual void write (ESM::ESMWriter& writer, Loading::Listener& progress) const {} virtual void write (ESM::ESMWriter& writer, Loading::Listener& progress) const {}
virtual RecordId read (ESM::ESMReader& reader) { return RecordId(); } virtual RecordId read (ESM::ESMReader& reader, bool overrideOnly = false) { return RecordId(); }
///< Read into dynamic storage ///< Read into dynamic storage
}; };
@ -192,7 +192,7 @@ namespace MWWorld
/// @note The record identifiers are listed in the order that the records were defined by the content files. /// @note The record identifiers are listed in the order that the records were defined by the content files.
void listIdentifier(std::vector<std::string> &list) const override; void listIdentifier(std::vector<std::string> &list) const override;
T *insert(const T &item); T *insert(const T &item, bool overrideOnly = false);
T *insertStatic(const T &item); T *insertStatic(const T &item);
bool eraseStatic(const std::string &id) override; bool eraseStatic(const std::string &id) override;
@ -201,7 +201,7 @@ namespace MWWorld
RecordId load(ESM::ESMReader &esm) override; RecordId load(ESM::ESMReader &esm) override;
void write(ESM::ESMWriter& writer, Loading::Listener& progress) const override; void write(ESM::ESMWriter& writer, Loading::Listener& progress) const override;
RecordId read(ESM::ESMReader& reader) override; RecordId read(ESM::ESMReader& reader, bool overrideOnly = false) override;
}; };
template <> template <>