//--------------------------------------------------- // destroyItem : // //--------------------------------------------------- void CGameItemManager::destroyItem( CGameItemPtr &ptr ) { H_AUTO(GIM_destroyItem); if (ptr == NULL) return; // used to know if we modified the content of a bag on the ground CGameItemPtr modifiedBag = NULL; // Remove the item from it's inventory (if any) if (ptr->getInventory() != NULL) { ptr->getInventory()->removeItem(ptr->getInventorySlot()); } if (ptr->getRefInventory() != NULL) { ptr->getRefInventory()->removeItem(ptr->getRefInventorySlot()); } ptr.deleteItem(); } // destroyItem //
// **************************************************************************** CInventoryBase::TInventoryOpResult CRefInventory::doInsertItem(CGameItemPtr &item, uint32 slot, bool autoStack, bool ignoreWeightAndBulk) { nlassert(item != NULL); nlassert(item->getRefInventory() == NULL); nlassert(slot < _Items.size() || slot == INVENTORIES::INVALID_INVENTORY_SLOT); if (!ignoreWeightAndBulk) { if (item->getStackWeight() + getInventoryWeight() > getMaxWeight()) return ior_overweight; if (item->getStackBulk() + getInventoryBulk() > getMaxBulk()) return ior_overbulk; } // check that we still have a free slot if (getFreeSlotCount() == 0) return ior_no_free_slot; if (slot == INVENTORIES::INSERT_IN_FIRST_FREE_SLOT) slot = getFirstFreeSlot(); // remove any item referenced here removeItem(slot); // insert and link the new item _Items[slot] = item; item->setRefInventory(CInventoryPtr(this), slot); updateWeightAndBulk(item, item->getStackSize()); --_FreeSlotCount; // callbacks for derived class onItemChanged(slot, INVENTORIES::itc_inserted); // callback views /*TViewCont::iterator first(_InventoryViews.begin()), last(_InventoryViews.end()); for (; first != last; ++first) { CInventoryViewPtr view = *first; view->onItemChanged(slot, itc_inserted); }*/ return ior_ok; }