1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-03-03 13:19:40 +00:00

removed items by mods do not break cell loading

like fortify intelligence potions removed by sris_alchemy which break the
loading of the firewatch mages guild
This commit is contained in:
Emmanuel Anne 2015-09-24 16:42:10 +02:00
parent caa119f13c
commit 2fff6b06cc

View file

@ -411,41 +411,48 @@ void MWWorld::ContainerStore::fill (const ESM::InventoryList& items, const std::
void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::string& owner, void MWWorld::ContainerStore::addInitialItem (const std::string& id, const std::string& owner,
int count, bool topLevel, const std::string& levItem) int count, bool topLevel, const std::string& levItem)
{ {
ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), id, count); try {
ManualRef ref (MWBase::Environment::get().getWorld()->getStore(), id, count);
if (ref.getPtr().getTypeName()==typeid (ESM::ItemLevList).name()) if (ref.getPtr().getTypeName()==typeid (ESM::ItemLevList).name())
{
const ESM::ItemLevList* levItem = ref.getPtr().get<ESM::ItemLevList>()->mBase;
if (topLevel && std::abs(count) > 1 && levItem->mFlags & ESM::ItemLevList::Each)
{ {
for (int i=0; i<std::abs(count); ++i) const ESM::ItemLevList* levItem = ref.getPtr().get<ESM::ItemLevList>()->mBase;
addInitialItem(id, owner, count > 0 ? 1 : -1, true, levItem->mId);
return; if (topLevel && std::abs(count) > 1 && levItem->mFlags & ESM::ItemLevList::Each)
{
for (int i=0; i<std::abs(count); ++i)
addInitialItem(id, owner, count > 0 ? 1 : -1, true, levItem->mId);
return;
}
else
{
std::string id = MWMechanics::getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false);
if (id.empty())
return;
addInitialItem(id, owner, count, false, levItem->mId);
}
} }
else else
{ {
std::string id = MWMechanics::getLevelledItem(ref.getPtr().get<ESM::ItemLevList>()->mBase, false); // A negative count indicates restocking items
if (id.empty()) // For a restocking levelled item, remember what we spawned so we can delete it later when the merchant restocks
return; if (!levItem.empty() && count < 0)
addInitialItem(id, owner, count, false, levItem->mId); {
} if (mLevelledItemMap.find(id) == mLevelledItemMap.end())
} mLevelledItemMap[id] = 0;
else mLevelledItemMap[id] += std::abs(count);
{ }
// A negative count indicates restocking items count = std::abs(count);
// For a restocking levelled item, remember what we spawned so we can delete it later when the merchant restocks
if (!levItem.empty() && count < 0)
{
if (mLevelledItemMap.find(id) == mLevelledItemMap.end())
mLevelledItemMap[id] = 0;
mLevelledItemMap[id] += std::abs(count);
}
count = std::abs(count);
ref.getPtr().getCellRef().setOwner(owner); ref.getPtr().getCellRef().setOwner(owner);
addImp (ref.getPtr(), count); addImp (ref.getPtr(), count);
}
} }
catch (const std::exception& e)
{
std::cerr << "Error in MWWorld::ContainerStore::addInitialItem: " << e.what() << std::endl;
}
} }
void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MWWorld::Ptr& ptr, const std::string& owner) void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MWWorld::Ptr& ptr, const std::string& owner)