// Swap items in inventory bool Inventory::SwapItem(int16 slot_a, int16 slot_b) { // Temp holding areas for a and b ItemInst* inst_a = GetItem(slot_a); ItemInst* inst_b = GetItem(slot_b); if(inst_a) { if(!inst_a->IsSlotAllowed(slot_b)) { return false; } } if(inst_b) { if(!inst_b->IsSlotAllowed(slot_a)) { return false; } } _PutItem(slot_a, inst_b); // Copy b->a _PutItem(slot_b, inst_a); // Copy a->b return true; }
// Remove item from inventory (with memory delete) bool Inventory::DeleteItem(int16 slot_id, uint8 quantity) { // Pop item out of inventory map (or queue) ItemInst* item_to_delete = PopItem(slot_id); // Determine if object should be fully deleted, or // just a quantity of charges of the item can be deleted if (item_to_delete && (quantity > 0)) { item_to_delete->SetCharges(item_to_delete->GetCharges() - quantity); // If there are no charges left on the item, if(item_to_delete->GetCharges() <= 0) { // If the item is stackable (e.g arrows), or // the item is not stackable, and is not a charged item, or is expendable, delete it if(item_to_delete->IsStackable() || (!item_to_delete->IsStackable() && ((item_to_delete->GetItem()->MaxCharges == 0) || item_to_delete->IsExpendable()))) { // Item can now be destroyed Inventory::MarkDirty(item_to_delete); return true; } } // Charges still exist, or it is a charged item that is not expendable. Put back into inventory _PutItem(slot_id, item_to_delete); return false; } Inventory::MarkDirty(item_to_delete); return true; }
void EQEmu::ItemInstance::PutItem(uint8 index, const ItemInstance& inst) { // Clean up item already in slot (if exists) DeleteItem(index); // Delegate to internal method _PutItem(index, inst.Clone()); }
// Put an item snto specified slot int16 Inventory::PutItem(int16 slot_id, const ItemInst& inst) { // Clean up item already in slot (if exists) DeleteItem(slot_id); if (!inst) { // User is effectively deleting the item // in the slot, why hold a null ptr in map<>? return slot_id; } // Delegate to internal method return _PutItem(slot_id, inst.Clone()); }