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:
parent
f089c94d34
commit
5e1960a76a
3 changed files with 16 additions and 8 deletions
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 <>
|
||||||
|
|
Loading…
Reference in a new issue