/// <summary>
        /// Decreases an item from player's inventory.
        /// </summary>
        /// <param name="player">Player.</param>
        /// <param name="item">Item to decrease.</param>
        private void DecreaseItem(IPlayerEntity player, Item item, bool noFollowSfx = false)
        {
            var itemUpdateType = UpdateItemType.UI_NUM;

            if (player.Inventory.ItemHasCoolTime(item))
            {
                itemUpdateType = UpdateItemType.UI_COOLTIME;
                player.Inventory.SetCoolTime(item, item.Data.CoolTime);
            }

            if (!item.Data.IsPermanant)
            {
                item.Quantity--;
            }

            _inventoryPacketFactory.SendItemUpdate(player, itemUpdateType, item.UniqueId, item.Quantity);

            if (item.Data.SfxObject3 != 0)
            {
                _specialEffectSystem.StartSpecialEffect(player, (DefineSpecialEffects)item.Data.SfxObject3, noFollowSfx);
            }

            if (item.Quantity <= 0)
            {
                item.Reset();
            }
        }
Exemple #2
0
        /// <inheritdoc />
        public int CreateItem(IPlayerEntity player, ItemDescriptor item, int quantity, int creatorId = -1, bool sendToPlayer = true)
        {
            int createdAmount = 0;

            if (item.Data.IsStackable)
            {
                for (var i = 0; i < InventoryContainerComponent.InventorySize; i++)
                {
                    Item inventoryItem = player.Inventory.GetItemAtIndex(i);

                    if (inventoryItem?.Id == item.Id)
                    {
                        if (inventoryItem.Quantity + quantity > item.Data.PackMax)
                        {
                            int boughtQuantity = inventoryItem.Data.PackMax - inventoryItem.Quantity;

                            createdAmount          = boughtQuantity;
                            quantity              -= boughtQuantity;
                            inventoryItem.Quantity = inventoryItem.Data.PackMax;
                        }
                        else
                        {
                            createdAmount           = quantity;
                            inventoryItem.Quantity += quantity;
                            quantity = 0;
                        }

                        if (sendToPlayer)
                        {
                            _inventoryPacketFactory.SendItemUpdate(player, UpdateItemType.UI_NUM, inventoryItem.UniqueId, inventoryItem.Quantity);
                        }
                    }
                }

                if (quantity > 0)
                {
                    int availableSlot = player.Inventory.GetAvailableSlot();

                    if (availableSlot == -1)
                    {
                        _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE);
                    }
                    else
                    {
                        Item newItem = _itemFactory.CreateItem(item.Id, item.Refine, item.Element, item.ElementRefine, creatorId);

                        if (newItem == null)
                        {
                            throw new ArgumentNullException(nameof(newItem));
                        }

                        newItem.Quantity = quantity;
                        newItem.Slot     = availableSlot;

                        player.Inventory.SetItemAtSlot(newItem, availableSlot);

                        if (sendToPlayer)
                        {
                            _inventoryPacketFactory.SendItemCreation(player, newItem);
                        }

                        createdAmount += quantity;
                    }
                }
            }
            else
            {
                while (quantity > 0)
                {
                    int availableSlot = player.Inventory.GetAvailableSlot();

                    if (availableSlot == -1)
                    {
                        _textPacketFactory.SendDefinedText(player, DefineText.TID_GAME_LACKSPACE);
                        break;
                    }

                    Item newItem = _itemFactory.CreateItem(item.Id, item.Refine, item.Element, item.ElementRefine, creatorId);

                    if (newItem == null)
                    {
                        throw new ArgumentNullException(nameof(newItem));
                    }

                    newItem.Quantity = 1;
                    newItem.Slot     = availableSlot;

                    player.Inventory.SetItemAtSlot(newItem, availableSlot);

                    if (sendToPlayer)
                    {
                        _inventoryPacketFactory.SendItemCreation(player, newItem);
                    }

                    createdAmount++;
                    quantity--;
                }
            }

            return(createdAmount);
        }