//----[ splitItem ]---------------------------------------------------------- bool ClientItemsInterface::splitItem(unsigned int index) { if (!inventoryItemIsValid(index)) return false; AvatarInventoryItem* inventory_item = &inventory_[index]; if (!inventory_item->stackable || // item must be stackable... inventory_item->equipped) return false; // ...and in the inventory ItemInstance* item = inventory_item->item.dereferenceAssumingValid(); // justified by validity check if (canHoldItems(1) == false) return false; // const int original_quantity = item->getQuantity(); if (original_quantity <= 1) return false; // can't split a stack of 1 int new_quantity = original_quantity >> 1; // divide in half int quantity_remaining = original_quantity - new_quantity; // Create the new item ItemPointer new_item; if (!GlobalItemManager::singleton()->acquireNewItem(new_quantity, item->getDescription()->type_index, &new_item)) { return false; } // Put the new item in the inventory if (!addToInventory(new_item, NULL)) { GlobalItemManager::singleton()->releaseItem(&new_item); } // Adjust the quantity of the original item item->setQuantity(quantity_remaining); return true; }
//----[ 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; }