bool InventoryItem::Merge(InventoryItemRef to_merge, int32 qty, bool notify) { if(typeID() != to_merge->typeID()) { _log(ITEM__ERROR, "%s (%u): Asked to merge with %s (%u).", itemName().c_str(), itemID(), to_merge->itemName().c_str(), to_merge->itemID()); return false; } if(locationID() != to_merge->locationID() || flag() != to_merge->flag()) { _log(ITEM__ERROR, "%s (%u) in location %u, flag %u: Asked to merge with item %u in location %u, flag %u.", itemName().c_str(), itemID(), locationID(), flag(), to_merge->itemID(), to_merge->locationID(), to_merge->flag()); return false; } if(qty == 0) qty = to_merge->quantity(); if(qty <= 0) { _log(ITEM__ERROR, "%s (%u): Asked to merge with %d units of item %u.", itemName().c_str(), itemID(), qty, to_merge->itemID()); return false; } if(!AlterQuantity(qty, notify)) { _log(ITEM__ERROR, "%s (%u): Failed to add quantity %d.", itemName().c_str(), itemID(), qty); return false; } if(qty == to_merge->quantity()) { to_merge->Delete(); } else if(!to_merge->AlterQuantity(-qty, notify)) { _log(ITEM__ERROR, "%s (%u): Failed to remove quantity %d.", to_merge->itemName().c_str(), to_merge->itemID(), qty); return false; } return true; }
bool Ship::AlterCargoQty(InventoryItemRef item, int qtyChange) { // Make sure we actually contain this item! if (!Contains(item->itemID())) { // We don't contain it, sorry! return false; } // Calculate total volume needed. double volumeNeed = item->getAttribute(AttrVolume).get_float() * qtyChange; // Get remaining volume. double remain = GetRemainingCapacity(item->flag()); if (remain >= volumeNeed) { // We have enough space remaining, add the items. item->AlterQuantity(qtyChange); // Adjust the remaining volume. _IncreaseCargoHoldsUsedVolume(item->flag(), volumeNeed); return true; } return false; }