Exemple #1
0
    /// <summary>
    /// Execute drop action.
    /// </summary>
    /// <param name="eventData">Will contain item that is expected to drop here.</param>
    public void OnDrop(PointerEventData eventData)
    {
        InventoryItem eventSourceItem = eventData.pointerDrag.GetComponent <InventoryItem>();

        if (!eventSourceItem.CurrentParent.CanChildMove)
        {
            return;
        }
        // Source Item must be present.
        if (eventSourceItem == null)
        {
            throw new ArgumentException($"{nameof(InventorySlot)} dropped object is not item.");
        }

        // Slot must be valid for taking items.
        if (!SlotType.CanTakeItems())
        {
            return;
        }
        // Slot must be eligible for source item.
        if (!SlotType.CanAcceptItem(eventSourceItem.CurrentItemData.Type))
        {
            return;
        }

        if (newItemCallback != null && newItemCallback.Invoke(this, eventSourceItem))
        {
            return;
        }

        // Stacking happens if is not free and other item is also in stack-able category
        if (!IsFree && SlotType.CanStackItems() && CurrentItem.CanStackWith(eventSourceItem))
        {
            CurrentItem.UpdateStackSize(eventSourceItem);
            return;
        }

        // On free we can insert item.
        if (IsFree)
        {
            AdoptChild(eventSourceItem);
            return;
        }
    }