Removing a set amount of items from a players inventory removing a stack when not meant to

Discussion in 'Spigot Plugin Development' started by SystemUpdate_, Jul 8, 2015.

  1. Hello,

    I've ran into another issue, I was creating my own item removal code since I need to remove a set amount of items from a players inventory. The code works, but it has a bug. If I have a stack, it'll remove the stack when it shouldn't

    Code (Text):
    for(ItemStack item : player.getInventory().getContents()) {
                                if(item.hasItemMeta() && i.hasItemMeta()) {
                                    if (!i.getItemMeta().equals(item.getItemMeta())) {
                                        break;
                                    }
                                }
                            if (item.getEnchantments().equals(i.getEnchantments())) {
                                    if (item.getDurability() == i.getDurability()) {
                                           if (item.getData().getData() == i.getData().getData()) {
                                                if (item.getAmount() > i.getAmount()) {
                                                    item.setAmount(i.getAmount());
                                                    break;
                                                } else if (item.getAmount() == i.getAmount()) {
                                                    player.getInventory().remove(item);
                                                    break;
                                                } else if (item.getAmount() < i.getAmount()) {
                                                    i.setAmount(item.getAmount() - i.getAmount());
                                                    player.getInventory().remove(item);
                                                }
                                            }
                                        }

                                }
                            }
    Is the code
     
  2. For checking if ItemStack and another ItemStack are the same (durability, enchantments etc. not amount) just use ItemStack#isSimilar(ItemStack paramItemStack);.
    The rest should work perfectly.
     
  3. Ill switch that out, thanks for the suggestion but when the item stack "i" amounts was set to 6, it removed 60 when it should have only taken 6.

    EDIT:

    Updated code

    Code (Text):
                            for(ItemStack item : player.getInventory().getContents()) {
                                if (i.isSimilar(item)) {
                                    if (item.getAmount() > i.getAmount()) {
                                        item.setAmount(i.getAmount());
                                        break;
                                    } else if (item.getAmount() == i.getAmount()) {
                                        player.getInventory().remove(item);
                                        break;
                                    } else if (item.getAmount() < i.getAmount()) {
                                        i.setAmount(item.getAmount() - i.getAmount());
                                        player.getInventory().remove(item);
                                    }
                                }
                            }
     
  4. Can you give me actual code (with isSimilar)?

    @EDIT:
    Try with this code:
    Code (Text):

                    if (item.getAmount() == i.getAmount()) {
                        player.getInventory().remove(item);
                        break;
                    } else {
                        item.setAmount( item.getAmount() > i.getAmount() ? item.getAmount() - i.getAmount() : i.getAmount() - item.getAmount() );
                        player.getInventory().remove(item);
                        break;
                    }
    @SystemUpdate_
     
    #4 jakubzz, Jul 8, 2015
    Last edited: Jul 8, 2015
  5. That removes the entire stack for me, I only want to remove x amount (i.getAmount) of item i
     
  6. In that case, use ItemStack#setAmount(int paramInt); and then Player#updateInventory();
     
  7. I've fixed it using
    Code (Text):
    if (item.getAmount() == i.getAmount()) {
                                        player.getInventory().remove(item);
                                        break;
                                    } else {
                                        if(item.getAmount() > i.getAmount()){
                                            item.setAmount(item.getAmount() - i.getAmount());
                                            break;
                                        }else if(item.getAmount() < i.getAmount()){
                                            i.setAmount(i.getAmount() - item.getAmount());
                                            player.getInventory().remove(item);
                                        }
                                    }
     
  8. Update: It removes more then it's meant to for items that don't stack... Any help?
    EDIT:

    Solved with
    player.getInventory().setItem(player.getInventory().first(i), new ItemStack(Material.AIR));
     
    #8 SystemUpdate_, Jul 8, 2015
    Last edited: Jul 8, 2015