diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index 688b9a6379..2955e7af0c 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -147,63 +147,6 @@ namespace MWWorld IDMap mIds; IDMap mStaticIds; - template - static const T* esm3StoreInsert(ESMStore& stores, const T &toInsert) - { - const std::string id = "$dynamic" + std::to_string(stores.mDynamicCount++); - - Store &store = stores.getWritable(); - if (store.search(id) != nullptr) - { - const std::string msg = "Try to override existing record '" + id + "'"; - throw std::runtime_error(msg); - } - T record = toInsert; - - record.mId = id; - - T *ptr = store.insert(record); - auto esm3RecordType_find = stores.mStoreImp->mStoreToRecName.find(&stores.get()); - - if (esm3RecordType_find != stores.mStoreImp->mStoreToRecName.end()) - { - stores.mStoreImp->mIds[ptr->mId] = esm3RecordType_find->second; - } - return ptr; - } - - template - static const T * esm3overrideRecord(ESMStore& stores, const T &x) { - Store &store = stores.getWritable(); - - T *ptr = store.insert(x); - auto esm3RecordType_find = stores.mStoreImp->mStoreToRecName.find(&stores.get()); - if (esm3RecordType_find != stores.mStoreImp->mStoreToRecName.end()) - { - stores.mStoreImp->mIds[ptr->mId] = esm3RecordType_find->second; - } - return ptr; - } - - template - static const T *esm3insertStatic(ESMStore& stores, const T &x) - { - Store &store = stores.getWritable(); - 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); - auto esm3RecordType_find = stores.mStoreImp->mStoreToRecName.find(&stores.get()); - if (esm3RecordType_find != stores.mStoreImp->mStoreToRecName.end()) - { - stores.mStoreImp->mIds[ptr->mId] = esm3RecordType_find->second; - } - return ptr; - } - template static int AssignStoreToIndex(ESMStore& stores, Store& store) { @@ -382,6 +325,11 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo } } +int& ESMStore::getIdType(std::string& id) +{ + return mStoreImp->mIds[id]; +} + static std::size_t sTypeIndexCounter = 0; std::size_t& ESMStore::getTypeIndexCounter() @@ -742,28 +690,4 @@ void ESMStore::removeMissingObjects(Store& store) return ptr; } - - template<> const ESM::Book* ESMStore::insert(const ESM::Book &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Armor* ESMStore::insert(const ESM::Armor &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Class* ESMStore::insert(const ESM::Class &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Enchantment* ESMStore::insert(const ESM::Enchantment &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Potion* ESMStore::insert(const ESM::Potion &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Weapon* ESMStore::insert(const ESM::Weapon &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Clothing* ESMStore::insert(const ESM::Clothing &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - template<> const ESM::Spell* ESMStore::insert(const ESM::Spell &toInsert) { return ESMStoreImp::esm3StoreInsert(*this, toInsert);} - - - template<> const ESM::GameSetting* ESMStore::insertStatic(const ESM::GameSetting &toInsert) { return ESMStoreImp::esm3insertStatic(*this, toInsert); } - template<> const ESM::Static* ESMStore::insertStatic(const ESM::Static &toInsert) { return ESMStoreImp::esm3insertStatic(*this, toInsert); } - template<> const ESM::Door* ESMStore::insertStatic(const ESM::Door &toInsert) { return ESMStoreImp::esm3insertStatic(*this, toInsert); } - template<> const ESM::Global* ESMStore::insertStatic(const ESM::Global &toInsert) { return ESMStoreImp::esm3insertStatic(*this, toInsert); } - template<> const ESM::NPC* ESMStore::insertStatic(const ESM::NPC &toInsert) { return ESMStoreImp::esm3insertStatic(*this, toInsert); } - - - template<> const ESM::Container* ESMStore::overrideRecord(const ESM::Container &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } - template<> const ESM::Creature* ESMStore::overrideRecord(const ESM::Creature &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } - template<> const ESM::CreatureLevList* ESMStore::overrideRecord(const ESM::CreatureLevList &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } - template<> const ESM::Door* ESMStore::overrideRecord(const ESM::Door &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } - template<> const ESM::ItemLevList* ESMStore::overrideRecord(const ESM::ItemLevList &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } - template<> const ESM::NPC* ESMStore::overrideRecord(const ESM::NPC &toInsert) { return ESMStoreImp::esm3overrideRecord(*this, toInsert); } } // end namespace diff --git a/apps/openmw/mwworld/esmstore.hpp b/apps/openmw/mwworld/esmstore.hpp index 068bb054ca..c6b7050600 100644 --- a/apps/openmw/mwworld/esmstore.hpp +++ b/apps/openmw/mwworld/esmstore.hpp @@ -165,6 +165,8 @@ namespace MWWorld template void removeMissingObjects(Store& store); + int& getIdType(std::string& id); + using LuaContent = std::variant< ESM::LuaScriptsCfg, // data from an omwaddon std::string>; // path to an omwscripts file @@ -208,14 +210,58 @@ namespace MWWorld /// Insert a custom record (i.e. with a generated ID that will not clash will pre-existing records) template - const T* insert(const T& x); + const T *insert(const T &x) + { + const std::string id = "$dynamic" + std::to_string(mDynamicCount++); + + Store &store = getWritable(); + if (store.search(id) != nullptr) + { + const std::string msg = "Try to override existing record '" + id + "'"; + throw std::runtime_error(msg); + } + T record = x; + + record.mId = id; + + T *ptr = store.insert(record); + if constexpr (std::is_convertible*, DynamicStore*>::value) + { + getIdType(ptr->mId) = T::sRecordId; + } + return ptr; + } /// Insert a record with set ID, and allow it to override a pre-existing static record. template - const T *overrideRecord(const T &x); + const T *overrideRecord(const T &x) { + Store &store = getWritable(); + + T *ptr = store.insert(x); + if constexpr (std::is_convertible*, DynamicStore*>::value) + { + getIdType(ptr->mId) = T::sRecordId; + } + return ptr; + } template - const T *insertStatic(const T &x); + const T *insertStatic(const T &x) + { + Store& store = getWritable(); + 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); + if constexpr (std::is_convertible*, DynamicStore*>::value) + { + getIdType(ptr->mId) = T::sRecordId; + } + return ptr; + } // 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. @@ -238,6 +284,12 @@ namespace MWWorld /// Actors with the same ID share spells, abilities, etc. /// @return The shared spell list to use for this actor and whether or not it has already been initialized. std::pair, bool> getSpellList(const std::string& id) const; + + template <> + const ESM::Cell* insert(const ESM::Cell& cell); + + template <> + const ESM::NPC* insert(const ESM::NPC& npc); }; } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index c7492eec1b..fc90a14b25 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include