mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 18:35:20 +00:00
ESM Store: no more automatic function implementation that suppose a mId member
All the ESM3 store will continue to work the same, used a macro to quickly define the different functions
This commit is contained in:
parent
db2b4600aa
commit
0a0b301cc4
@ -204,6 +204,41 @@ namespace MWWorld
|
|||||||
}
|
}
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static const T * ESM3overrideRecord(ESMStore& stores, const T &x) {
|
||||||
|
Store<T> &store = const_cast<Store<T> &>( stores.get<T>());
|
||||||
|
|
||||||
|
T *ptr = store.insert(x);
|
||||||
|
for (ESMStore::iterator it = stores.mStores.begin(); it != stores.mStores.end(); ++it) {
|
||||||
|
if (it->second == &store) {
|
||||||
|
stores.mIds[ptr->mId] = it->first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static const T *ESM3insertStatic(ESMStore& stores, const T &x)
|
||||||
|
{
|
||||||
|
const std::string id = "$dynamic" + std::to_string(stores.mDynamicCount++);
|
||||||
|
|
||||||
|
Store<T> &store = const_cast<Store<T> &>( stores.get<T>());
|
||||||
|
if (store.search(id) != nullptr)
|
||||||
|
{
|
||||||
|
const std::string msg = "Try to override existing record '" + id + "'";
|
||||||
|
throw std::runtime_error(msg);
|
||||||
|
}
|
||||||
|
T record = x;
|
||||||
|
|
||||||
|
T *ptr = store.insertStatic(record);
|
||||||
|
for (ESMStore::iterator it = stores.mStores.begin(); it != stores.mStores.end(); ++it) {
|
||||||
|
if (it->second == &store) {
|
||||||
|
stores.mIds[ptr->mId] = it->first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ESMStore::ESMStore()
|
ESMStore::ESMStore()
|
||||||
@ -699,6 +734,24 @@ void ESMStore::removeMissingObjects(Store<T>& store)
|
|||||||
ESM3Insert(ESM::Spell);
|
ESM3Insert(ESM::Spell);
|
||||||
#undef ESM3Insert
|
#undef ESM3Insert
|
||||||
|
|
||||||
|
#define ESM3InsertStatic(__Type) template<> const __Type* ESMStore::insertStatic<__Type>(const __Type &toInsert) { return ESMStoreImp::ESM3insertStatic(*this, toInsert); }
|
||||||
|
ESM3InsertStatic(ESM::GameSetting);
|
||||||
|
ESM3InsertStatic(ESM::Static);
|
||||||
|
ESM3InsertStatic(ESM::Door);
|
||||||
|
ESM3InsertStatic(ESM::Global);
|
||||||
|
ESM3InsertStatic(ESM::NPC);
|
||||||
|
#undef ESM3InsertStatic
|
||||||
|
|
||||||
|
|
||||||
|
#define ESM3overrideRecord(__Type) template<> const __Type* ESMStore::overrideRecord<__Type>(const __Type &toInsert) { return ESMStoreImp::ESM3overrideRecord(*this, toInsert); }
|
||||||
|
ESM3overrideRecord(ESM::Container);
|
||||||
|
ESM3overrideRecord(ESM::Creature);
|
||||||
|
ESM3overrideRecord(ESM::CreatureLevList);
|
||||||
|
ESM3overrideRecord(ESM::Door);
|
||||||
|
ESM3overrideRecord(ESM::ItemLevList);
|
||||||
|
ESM3overrideRecord(ESM::NPC);
|
||||||
|
#undef ESM3overrideRecord
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
const Store<ESM::Activator> &ESMStore::get<ESM::Activator>() const {
|
const Store<ESM::Activator> &ESMStore::get<ESM::Activator>() const {
|
||||||
return mStoreImp->mActivators;
|
return mStoreImp->mActivators;
|
||||||
|
@ -119,36 +119,10 @@ namespace MWWorld
|
|||||||
|
|
||||||
/// Insert a record with set ID, and allow it to override a pre-existing static record.
|
/// Insert a record with set ID, and allow it to override a pre-existing static record.
|
||||||
template <class T>
|
template <class T>
|
||||||
const T *overrideRecord(const T &x) {
|
const T *overrideRecord(const T &x);
|
||||||
Store<T> &store = const_cast<Store<T> &>(get<T>());
|
|
||||||
|
|
||||||
T *ptr = store.insert(x);
|
|
||||||
for (iterator it = mStores.begin(); it != mStores.end(); ++it) {
|
|
||||||
if (it->second == &store) {
|
|
||||||
mIds[ptr->mId] = it->first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
const T *insertStatic(const T &x)
|
const T *insertStatic(const T &x);
|
||||||
{
|
|
||||||
Store<T> &store = const_cast<Store<T> &>(get<T>());
|
|
||||||
if (store.search(x.mId) != nullptr)
|
|
||||||
{
|
|
||||||
const std::string msg = "Try to override existing record '" + x.mId + "'";
|
|
||||||
throw std::runtime_error(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
T *ptr = store.insertStatic(x);
|
|
||||||
for (iterator it = mStores.begin(); it != mStores.end(); ++it) {
|
|
||||||
if (it->second == &store) {
|
|
||||||
mIds[ptr->mId] = it->first;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This method must be called once, after loading all master/plugin files. This can only be done
|
// This method must be called once, after loading all master/plugin files. This can only be done
|
||||||
// from the outside, so it must be public.
|
// from the outside, so it must be public.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user