示例#1
0
 /// <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));
     }
 }
示例#2
0
 /// <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);
                 }
             }
         }
     }
 }
示例#3
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);
        }
示例#4
0
        /// <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);
                        }
                    }
                }
            }
        }
示例#5
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);
     }
 }
示例#6
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);
        }