Minecraft Spigot 从库存中移除物品

Minecraft Spigot Remove item from inventory

我正在 spigot 1 中制作一个 bedwars 插件。8_R3,我目前正在开发商店系统,当你点击一个项目购买它时,4 个铁锭应该从玩家库存。

inventory.remove(new ItemStack(getResource(Main.plugin.getConfigValue("shop." + e.getCurrentItem().getTypeId() + ".type")), Integer.parseInt(Main.plugin.getConfigValue("shop." + e.getCurrentItem().getTypeId() + ".cost"))));

但是,如果恰好有 4 个铁锭,此代码只会移除铁。我如何才能从不同数量(例如 5 个)中取出 4 个铁锭?

编辑: 我尝试使用此代码:

    public void removeItemFromInventory(Inventory inv, ItemStack currentItem, Player p) {
        ItemStack item = new ItemStack(getResource(Main.plugin.getConfigValue("shop." + currentItem.getTypeId() + ".type")), Integer.parseInt(Main.plugin.getConfigValue("shop." + currentItem.getTypeId() + ".cost")));
        if(inv.contains(item)) { // contains the exact item
            inv.remove(item); // remove first time it find this item
        } else { // doesn't contains this item
            for(ItemStack invItem : inv.getContents()) {
                if(invItem.getType().equals(item.getType())) { // if it's this type of item.
                    // You can add other check specially for ItemMeta ...

                    int amount = invItem.getAmount(); // amount of actual item
                    int stay = item.getAmount(); // keep amount
                    if(amount > stay) { // too many item, just change amount
                        invItem.setAmount(amount - stay); // change amount to remove it
                        break; // stop loop
                    } else if(amount < stay) { // not enough item
                        invItem.setAmount(0); // you can also remove the item by setting air to this slot
                        item.setAmount(stay - amount); // reduce amount of item to delete
                    }
                }
            }
        }
        FastShop shop = new FastShop(p );
        p.closeInventory();
        p.openInventory(shop.getInventory());
    }

我目前遇到空指针错误。我仍然需要帮助!

这部分代码将搜索类似于“Iron Ingot x4”的物品。如果它不相似,它不会改变它是什么,因为它只是不同。

你应该这样做:

ItemStack item = new ItemStack(getResource(Main.plugin.getConfigValue("shop." + e.getCurrentItem().getTypeId() + ".type")), Integer.parseInt(Main.plugin.getConfigValue("shop." + e.getCurrentItem().getTypeId() + ".cost")));
if(inv.contains(item)) { // contains the exact item
   inv.remove(item); // remove first time it find this item
} else { // doesn't contains this item
   for(ItemStack invItem : inv.getContents()) {
      if(invItem != null && invItem.getType().equals(item.getType()) { // if it's this type of item.
          // You can add other check specially for ItemMeta ...

          int amount = invItem.getAmount(); // amount of actual item
          int stay = item.getAmount(); // keep amount
          if(amount > stay) { // too many item, just change amount
             invItem.setAmount(amount - stay); // change amount to remove it
             break; // stop loop
          } else if(amount < stay) { // not enough item
             invItem.setAmount(0); // you can also remove the item by setting air to this slot
             item.setAmount(stay - amount); // reduce amount of item to delete
          }
      }
   }
}
player.updateInventory();

这并不是一个完整的代码解决方案。但是,您可以这样做。

  1. 为所需的铁量创建一个整数。

  2. 创建一个遍历玩家库存的 for 循环,如果该插槽包含铁,则: 如果插槽中的数量大于铁整数,则取出铁 从该插槽中取出整数并给出所欠的项目。否则从铁整数中删除插槽中的数量并删除该插槽。

希望能解决您的问题。