//----[ giveItem ]----------------------------------------------------------- bool ClientItemsInterface::giveItem(ItemPointer* item_pointer, unsigned int* assigned_index) { if (!item_pointer || item_pointer->invalid()) return false; ItemInstance* item = item_pointer->dereferenceAssumingValid(); // justified by prev. line int source_quantity = item->getQuantity(); if (source_quantity < 0) return false; // stack with existing items if (item->isStackable()) { unsigned int start_search_index = 0; while (item && start_search_index < items_in_inventory_) { // keep the index safe! ItemInstance* stackable_item = NULL; if (!findStackableItemInInventory(item, start_search_index, &start_search_index, &stackable_item)) break; inventory_dirty_bits_.set(start_search_index); update_inventory_ = true; ++start_search_index; item->setQuantity(stackable_item->addQuantity(item->getQuantity())); if (item->getQuantity() <= 0) { GlobalItemManager::singleton()->releaseItem(item_pointer); item = NULL; } } } // add to the inventory return item ? addToInventory(*item_pointer, assigned_index) : true; }
//----[ setInventoryItem ]--------------------------------------------------- void ClientItemsInterface::setInventoryItem(unsigned int index, ItemPointer& item_pointer) { ItemInstance* item = item_pointer.dereferenceAssumingValid(); inventory_[index].item.copy(item_pointer); inventory_[index].stackable = item->isStackable(); inventory_[index].equipped = false; inventory_dirty_bits_.set(index); update_inventory_ = true; { // become the owner of this item //inventory_[index].item.becomeUniquePointer(); GlobalDatabaseManager::singleton()->itemChangeOwner(item->getUniqueID(), account_id_, character_id_, session_id_); } }