diff --git a/apps/openmw/mwlua/types/npc.cpp b/apps/openmw/mwlua/types/npc.cpp index 220b845882..2f6b0fa0ba 100644 --- a/apps/openmw/mwlua/types/npc.cpp +++ b/apps/openmw/mwlua/types/npc.cpp @@ -41,8 +41,7 @@ namespace else npc.blank(); - if (npc.mId == ESM::RefId::deserializeText("Player")) - npc.mId = ESM::RefId::deserializeText("blank"); + npc.mId = {}; // Basic fields if (rec["name"] != sol::nil) diff --git a/apps/openmw/mwlua/worldbindings.cpp b/apps/openmw/mwlua/worldbindings.cpp index dca136cd63..228e70b464 100644 --- a/apps/openmw/mwlua/worldbindings.cpp +++ b/apps/openmw/mwlua/worldbindings.cpp @@ -191,7 +191,11 @@ namespace MWLua }, [lua = context.mLua](const ESM::NPC& npc) -> const ESM::NPC* { checkGameInitialized(lua); - return MWBase::Environment::get().getESMStore()->insert(npc); + if (npc.mId.empty()) + return MWBase::Environment::get().getESMStore()->insert(npc); + ESM::NPC copy = npc; + copy.mId = {}; + return MWBase::Environment::get().getESMStore()->insert(copy); }, [lua = context.mLua](const ESM::Weapon& weapon) -> const ESM::Weapon* { checkGameInitialized(lua); diff --git a/apps/openmw/mwworld/store.cpp b/apps/openmw/mwworld/store.cpp index 0e64e6e627..870c2a60c9 100644 --- a/apps/openmw/mwworld/store.cpp +++ b/apps/openmw/mwworld/store.cpp @@ -276,22 +276,15 @@ namespace MWWorld return it != map.end(); } - template - inline bool shouldInsert(const ESM::RefId& id, const StaticMap& map) - { - if (!id.template is()) - { - auto it = map.find(id); - return it != map.end(); - } - return true; - } template T* TypedDynamicStore::insert(const T& item, bool overrideOnly) { + if constexpr (std::is_same_v) + overrideOnly = overrideOnly && !item.mId.template is(); if (overrideOnly) { - if (!shouldInsert(item.mId, mStatic)) + auto it = mStatic.find(item.mId); + if (it == mStatic.end()) return nullptr; } std::pair result = mDynamic.insert_or_assign(item.mId, item);