/// <summary> /// Equips the item at the specified slot /// </summary> /// <param name="item">Item.</param> /// <param name="index">Index.</param> /// <param name="slot">Slot.</param> public virtual void EquipItem(InventoryItem item, int index, InventorySlot slot = null) { if (InventoryType == Inventory.InventoryTypes.Main) { InventoryItem oldItem = null; if (InventoryItem.IsNull(item)) { MMEventManager.TriggerEvent(new MMInventoryEvent(MMInventoryEventType.Error, slot, this.name, null, 0, index)); return; } // if the object is not equipable, we do nothing and exit if (!item.Equippable) { return; } // if a target equipment inventory is not set, we do nothing and exit if (item.TargetEquipmentInventory == null) { Debug.LogWarning("InventoryEngine Warning : " + Content[index].ItemName + "'s target equipment inventory couldn't be found."); return; } // if the object can't be moved, we play an error sound and exit if (!item.CanMoveObject) { MMEventManager.TriggerEvent(new MMInventoryEvent(MMInventoryEventType.Error, slot, this.name, null, 0, index)); return; } // call the equip method of the item item.Equip(); // if this is a mono slot inventory, we prepare to swap if (item.TargetEquipmentInventory.Content.Length == 1) { if (!InventoryItem.IsNull(item.TargetEquipmentInventory.Content[0])) { if ( (item.CanSwapObject) && (item.TargetEquipmentInventory.Content[0].CanMoveObject) && (item.TargetEquipmentInventory.Content[0].CanSwapObject) ) { // we store the item in the equipment inventory oldItem = item.TargetEquipmentInventory.Content[0].Copy(); item.TargetEquipmentInventory.EmptyInventory(); } } } // we add one to the target equipment inventory item.TargetEquipmentInventory.AddItem(item.Copy(), item.Quantity); // remove 1 from quantity RemoveItem(index, item.Quantity); if (oldItem != null) { oldItem.Swap(); AddItem(oldItem, oldItem.Quantity); } MMEventManager.TriggerEvent(new MMInventoryEvent(MMInventoryEventType.ItemEquipped, slot, this.name, item, item.Quantity, index)); } }
/// <summary> /// Split item stack in half /// </summary> public virtual void SplitItemStack() { if (!_inVendor && !_isMoving) { Inventory _inventory = CurrentlySelectedInventorySlot.ParentInventoryDisplay.TargetInventory; int _freeSlots = _inventory.NumberOfFreeSlots; if (_freeSlots < 1) { return; } else { _slotFrom = CurrentlySelectedInventorySlot; _indexFrom = _slotFrom.Index; _inventoryItemFrom = _inventory.Content[_indexFrom]; if (_inventoryItemFrom != null) { _quantityFrom = _inventoryItemFrom.Quantity; if (_quantityFrom > 1) { int low = (int)Mathf.Floor(_quantityFrom / 2.0f); int high = (int)Mathf.Ceil(_quantityFrom / 2.0f); InventoryItem tmpItemLow = _inventoryItemFrom.Copy(); tmpItemLow.Quantity = low; InventoryItem tmpItemHigh = _inventoryItemFrom.Copy(); tmpItemHigh.Quantity = high; int freeSlot = FindFirstFreeSlot(_inventory); _inventory.Content[_indexFrom] = tmpItemHigh; _inventory.Content[freeSlot] = tmpItemLow; MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, _inventory.name, null, 0, 0); MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, _inventory.name, null, 0, 0); } } } } }
/// <summary> /// Adds the item to content array. /// </summary> /// <returns><c>true</c>, if item to array was added, <c>false</c> otherwise.</returns> /// <param name="itemToAdd">Item to add.</param> /// <param name="quantity">Quantity.</param> protected virtual bool AddItemToArray(InventoryItem itemToAdd, int quantity) { if (NumberOfFreeSlots == 0) { return(false); } int i = 0; while (i < Content.Length) { if (InventoryItem.IsNull(Content[i])) { Content[i] = itemToAdd.Copy(); Content[i].Quantity = quantity; return(true); } i++; } return(false); }
/// <summary> /// Buy item or items from vendor /// </summary> public virtual void BuyItem() { Vendor openedVendor = null; Vendor[] vendors = FindObjectsOfType <Vendor>(); foreach (Vendor vendor in vendors) { if (vendor.enabled && vendor.isOpen) { openedVendor = vendor; } } if (openedVendor != null) { InventorySlot slot = CurrentlySelectedInventorySlot; Inventory inventory = slot.ParentInventoryDisplay.TargetInventory; int index = slot.Index; InventoryItem item = inventory.Content[index]; InventoryDetailsExtended ide = FindObjectOfType <InventoryDetailsExtended>(); if (ide != null && item != null && ide.disabledItems.Contains(item) == false && (inventory.name == openedVendor.vendorInventory.name || inventory.name == openedVendor.vendorRollBackInventory.name)) { int quantity = Int32.Parse(ide.vendorQuantity.text); int price = Int32.Parse(ide.vendorPrice.text); int cash = openedVendor.GetPlayerCash(); if (cash >= price) { int freeSlot = FindFirstFreeSlot(openedVendor.mainInventory); if (freeSlot != -1) { openedVendor.PayForItem(price); openedVendor.mainInventory.Content[freeSlot] = item.Copy(); openedVendor.mainInventory.Content[freeSlot].Quantity = quantity; MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, openedVendor.mainInventory.name, null, 0, 0); } if (inventory.name == openedVendor.vendorInventory.name) { //vendor has limited stock if (openedVendor.limitedStock) { if (quantity < item.Quantity) { item.Quantity -= quantity; } else { openedVendor.vendorInventory.DestroyItem(index); } MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, openedVendor.vendorInventory.name, null, 0, 0); } } else if (inventory.name == openedVendor.vendorRollBackInventory.name) { if (quantity < item.Quantity) { item.Quantity -= quantity; } else { openedVendor.vendorRollBackInventory.DestroyItem(index); } MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, openedVendor.vendorRollBackInventory.name, null, 0, 0); } } } } }
/// <summary> /// Move method supporting move between inventories /// </summary> protected virtual void MultiInventoryMove(bool keyboard) { //We have selected first slot and hit Move button if (_isMoving == false) { _slotFrom = CurrentlySelectedInventorySlot; _inventoryFrom = _slotFrom.ParentInventoryDisplay.TargetInventory; _indexFrom = _slotFrom.Index; _inventoryItemFrom = _inventoryFrom.Content[_indexFrom]; //selected slot has an item in it so we gather rest of item data like item quantity and change sprite to Moved so we can see what happened if (_inventoryItemFrom != null) { _quantityFrom = _inventoryItemFrom.Quantity; //now we store none selected slot sprite to change it after moving _oldSprite = CurrentlySelectedInventorySlot.GetComponent <Image>().sprite; //now we change the slot sprite to Moved _slotFrom.GetComponent <Image>().sprite = _slotFrom.MovedSprite; //and by setting _isMoving to "true" we can wait for next click on slot _isMoving = true; if (keyboard) { _useKeyboardJoypad = true; } } } //We have selected second slot else { _slotTo = CurrentlySelectedInventorySlot; _inventoryTo = _slotTo.ParentInventoryDisplay.TargetInventory; _indexTo = _slotTo.Index; _inventoryItemTo = _inventoryTo.Content[_indexTo]; if (_inventoryTo.name == _inventoryFrom.name) { if (_indexTo == _indexFrom) { return; } } //second clicked slot is empty so we add item to this inventory, move to desired slot and remove it from first one if (_inventoryItemTo == null) { //we change first selected slot sprite back to old sprite _slotFrom.GetComponent <Image>().sprite = _oldSprite; //we add item to selected inventory _inventoryTo.Content[_indexTo] = _inventoryItemFrom.Copy(); //we remove item from first inventory _inventoryFrom.DestroyItem(_indexFrom); _inventoryFrom.Content[_indexFrom] = null; } else { _quantityTo = _inventoryItemTo.Quantity; //we check if item is the same as we try to move if (_inventoryItemFrom.ItemName == _inventoryItemTo.ItemName) { //we check what is the rest free quantity to close the full sack int _restStack = _inventoryItemTo.MaximumStack - _quantityTo; //if quantity of our item we try to move in less or equal than free quantity if (_quantityFrom <= _restStack) { //we update quantity of our item _inventoryItemTo.Quantity = _inventoryItemTo.Quantity + _quantityFrom; //we remove item from first inventory _inventoryFrom.DestroyItem(_indexFrom); } //if quantity of our item we try to move is higher than free quantity else if (_quantityFrom > _restStack) { //we update quantity of our item to full stack _inventoryItemTo.Quantity = _inventoryItemTo.MaximumStack; //we check what's left after moving some items int _restToAddQuantity = _quantityFrom - _restStack; //if there is free slot in second inventory if (_inventoryTo.NumberOfFreeSlots >= 1) { //we need to find first free slot int _fistFreeSlot = FindFirstFreeSlot(_inventoryTo); //we add rest of item quantity to inventory as new item _inventoryTo.Content[_fistFreeSlot] = _inventoryItemFrom; _inventoryTo.Content[_fistFreeSlot].Quantity = _restToAddQuantity; //we remove item from first inventory _inventoryFrom.DestroyItem(_indexFrom); } //there is no free slots in second inventory else { //we reduce item quantity in first inventory _inventoryFrom.Content[_indexFrom].Quantity = _inventoryFrom.Content[_indexFrom].Quantity - _restStack; } } } else { //we need to create copy of item from first inventory InventoryItem _tempItemFrom = _inventoryItemFrom.Copy(); //we need to create copy of item from second inventory InventoryItem _tempItemTo = _inventoryItemTo.Copy(); //we remove item from first inventory _inventoryFrom.DestroyItem(_indexFrom); //we remove item from second inventory _inventoryTo.DestroyItem(_indexTo); //we add item from first inventory to second inventory _inventoryTo.Content[_indexTo] = _tempItemFrom.Copy(); //we add item from second inventory to first inventory _inventoryFrom.Content[_indexFrom] = _tempItemTo.Copy(); } } _isMoving = false; if (keyboard) { _useKeyboardJoypad = false; } MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, _inventoryFrom.name, null, 0, 0); MMInventoryEvent.Trigger(MMInventoryEventType.ContentChanged, null, _inventoryTo.name, null, 0, 0); } }
/// <summary> /// Triggers the use and potential consumption of the item passed in parameter. You can also specify the item's slot (optional) and index. /// </summary> /// <param name="item">Item.</param> /// <param name="slot">Slot.</param> /// <param name="index">Index.</param> public virtual bool UseItem(InventoryItem item, int index, InventorySlot slot = null) { if (InventoryItem.IsNull(item)) { MMInventoryEvent.Trigger(MMInventoryEventType.Error, slot, this.name, null, 0, index); return(false); } if (!item.IsUsable) { return(false); } if (item.Use()) { // remove 1 from quantity MMInventoryEvent.Trigger(MMInventoryEventType.ItemUsed, slot, this.name, item.Copy(), 0, index); RemoveItem(index, 1); } return(true); }