public void TakeItem(InventoryData inventory, Item item)
        {
            if (item != null && !character.IsDoingAction() && inventory.CanTakeItem(item.data.id, item.quantity))
            {
                character.FaceTorward(item.transform.position);

                if (onTakeItem != null)
                {
                    onTakeItem.Invoke(item);
                }

                character.TriggerAction(0.4f, () =>
                {
                    //Make sure wasnt destroyed during the 0.4 sec
                    if (item != null && inventory.CanTakeItem(item.data.id, item.quantity))
                    {
                        PlayerData pdata             = PlayerData.Get();
                        DroppedItemData dropped_item = pdata.GetDroppedItem(item.GetUID());
                        float durability             = dropped_item != null ? dropped_item.durability : item.data.durability;
                        int slot = inventory.AddItem(item.data.id, item.quantity, durability, item.GetUID()); //Add to inventory

                        ItemTakeFX.DoTakeFX(item.transform.position, item.data, inventory.type, slot);

                        item.TakeItem(); //Destroy item
                    }
                });
            }
        }
        //------- Items ----------

        //Take an Item on the floor
        public void TakeItem(Item item)
        {
            if (BagData != null && !InventoryData.CanTakeItem(item.data.id, item.quantity))
            {
                TakeItem(BagData, item); //Take into bag
            }
            else
            {
                TakeItem(InventoryData, item); //Take into main inventory
            }
        }
 public void GainItem(ItemData item, int quantity, Vector3 source_pos)
 {
     if (BagData != null && !InventoryData.CanTakeItem(item.id, quantity))
     {
         GainItem(BagData, item, quantity, source_pos); //Gain into bag
     }
     else
     {
         GainItem(InventoryData, item, quantity, source_pos); //Gain into main inventory
     }
 }
 //Return inventory that can take item (main one first, then bag)
 public InventoryData GetValidInventory(ItemData item, int quantity)
 {
     if (InventoryData.CanTakeItem(item.id, quantity))
     {
         return(InventoryData);
     }
     else if (BagData != null && BagData.CanTakeItem(item.id, quantity))
     {
         return(BagData);
     }
     return(null);
 }
        public void AutoTakeItem(InventoryData inventory, Item item)
        {
            if (item != null && !character.IsDoingAction() && inventory.CanTakeItem(item.data.id, item.quantity))
            {
                PlayerData      pdata        = PlayerData.Get();
                DroppedItemData dropped_item = pdata.GetDroppedItem(item.GetUID());
                float           durability   = dropped_item != null ? dropped_item.durability : item.data.durability;
                int             slot         = inventory.AddItem(item.data.id, item.quantity, durability, item.GetUID()); //Add to inventory

                ItemTakeFX.DoTakeFX(item.transform.position, item.data, inventory.type, slot);

                item.TakeItem(); //Destroy item
            }
        }
        public override void DoAction(PlayerCharacter character, ItemSlot slot)
        {
            int               half      = slot.GetQuantity() / 2;
            ItemData          item      = slot.GetItem();
            InventoryData     inventory = slot.GetInventory();
            InventoryItemData item_data = inventory.GetItem(slot.index);

            inventory.RemoveItemAt(slot.index, half);

            bool          can_take   = inventory.CanTakeItem(item.id, half);
            InventoryData ninventory = can_take ? inventory : character.Inventory.GetValidInventory(item, half); //If cant take, find a valid one
            int           new_slot   = ninventory.GetFirstEmptySlot();

            ninventory.AddItemAt(item.id, new_slot, half, item_data.durability, UniqueID.GenerateUniqueID());
        }
        public void UnequipItem(EquipSlot eslot)
        {
            InventoryItemData invdata = EquipData.GetEquippedItem(eslot);

            if (invdata != null && InventoryData.CanTakeItem(invdata.item_id, 1))
            {
                EquipData.UnequipItem(eslot);
                InventoryData.AddItem(invdata.item_id, 1, invdata.durability, invdata.uid);
            }
            else if (invdata != null && BagData != null && BagData.CanTakeItem(invdata.item_id, 1))
            {
                EquipData.UnequipItem(eslot);
                BagData.AddItem(invdata.item_id, 1, invdata.durability, invdata.uid);
            }
        }
 public void GainItem(InventoryData inventory, ItemData item, int quantity, Vector3 source_pos)
 {
     if (item != null)
     {
         if (inventory.CanTakeItem(item.id, quantity))
         {
             if (inventory.type == InventoryType.Equipment)
             {
                 EquipData.EquipItem(item.equip_slot, item.id, item.durability, UniqueID.GenerateUniqueID());
                 ItemTakeFX.DoTakeFX(source_pos, item, inventory.type, (int)item.equip_slot);
             }
             else
             {
                 int islot = inventory.AddItem(item.id, quantity, item.durability, UniqueID.GenerateUniqueID());
                 ItemTakeFX.DoTakeFX(source_pos, item, inventory.type, islot);
             }
         }
         else
         {
             Item.Create(item, character.GetPosition(), quantity);
         }
     }
 }
 //Check both bag and inventory
 public bool CanTakeItem(ItemData item, int quantity = 1)
 {
     return(item != null && (InventoryData.CanTakeItem(item.id, quantity) ||
                             (BagData != null && BagData.CanTakeItem(item.id, quantity))));
 }