Adjust restock calculations to ignore filled soul gems.

Bug #3684
0.6.1
Jordan Ayers 8 years ago
parent 3356fb81ce
commit b277bd782e

@ -156,6 +156,16 @@ int MWWorld::ContainerStore::count(const std::string &id)
return total; return total;
} }
int MWWorld::ContainerStore::restockCount(const std::string &id)
{
int total=0;
for (MWWorld::ContainerStoreIterator iter (begin()); iter!=end(); ++iter)
if (Misc::StringUtils::ciEqual(iter->getCellRef().getRefId(), id))
if (iter->getCellRef().getSoul().empty())
total += iter->getRefData().getCount();
return total;
}
MWWorld::ContainerStoreListener* MWWorld::ContainerStore::getContListener() const MWWorld::ContainerStoreListener* MWWorld::ContainerStore::getContListener() const
{ {
return mListener; return mListener;
@ -512,7 +522,7 @@ void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MW
for (std::map<std::pair<std::string, std::string>, int>::iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end();) for (std::map<std::pair<std::string, std::string>, int>::iterator it = mLevelledItemMap.begin(); it != mLevelledItemMap.end();)
{ {
int spawnedCount = it->second; //How many items should be in shop originally int spawnedCount = it->second; //How many items should be in shop originally
int itemCount = count(it->first.first); //How many items are there in shop now int itemCount = restockCount(it->first.first); //How many items are there in shop now
//If something was not sold //If something was not sold
if(itemCount >= spawnedCount) if(itemCount >= spawnedCount)
{ {
@ -578,7 +588,7 @@ void MWWorld::ContainerStore::restock (const ESM::InventoryList& items, const MW
else else
{ {
//Restocking static item - just restock to the max count //Restocking static item - just restock to the max count
int currentCount = count(itemOrList); int currentCount = restockCount(itemOrList);
if (currentCount < std::abs(it->mCount)) if (currentCount < std::abs(it->mCount))
addInitialItem(itemOrList, owner, -(std::abs(it->mCount) - currentCount), true); addInitialItem(itemOrList, owner, -(std::abs(it->mCount) - currentCount), true);
} }

@ -162,8 +162,12 @@ namespace MWWorld
/// If a compatible stack is found, the item's count is added to that stack, then the original is deleted. /// If a compatible stack is found, the item's count is added to that stack, then the original is deleted.
/// @return If the item was stacked, return the stack, otherwise return the old (untouched) item. /// @return If the item was stacked, return the stack, otherwise return the old (untouched) item.
/// @return How many items with refID \a id are in this container?
int count (const std::string& id); int count (const std::string& id);
///< @return How many items with refID \a id are in this container?
int restockCount (const std::string& id);
///< Item count with restock adjustments (such as ignoring filled soul gems).
/// @return How many items with refID \a id are in this container?
ContainerStoreListener* getContListener() const; ContainerStoreListener* getContListener() const;
void setContListener(ContainerStoreListener* listener); void setContListener(ContainerStoreListener* listener);

Loading…
Cancel
Save