从库存中删除自定义项目

时间:2015-11-21 18:04:12

标签: java bukkit

ItemStack item = new ItemStack(Material.PAPER);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(ChatColor.GREEN + "$5 Banknote");
item.setItemMeta(meta);

if (player.getInventory().contains(item))
{
    player.getInventory().removeItem(item);
    player.updateInventory();
    econ.depositPlayer(player, 5);
    player.sendMessage(ChatColor.GREEN + "You have deposited a $5 banknote and $5 has been added to your account!");
}

所以,我有这个命令,如果运行,它应该从你的库存中取出物品(钞票)并给你钱作为回报。如果项目没有堆叠,它可以工作,但如果它是堆叠的,它不会将堆栈识别为项目(钞票)。

我在这里做错了什么?如何堆叠,它会识别它,并从该堆栈中删除一个项目?

3 个答案:

答案 0 :(得分:1)

contains(ItemStack)类中实施的CraftInventory方法会遍历广告资源的内容,并使用equals(Object)方法将每个ItemStack与您所拥有的equals(Object)进行比较寻找。 ItemStack的{​​{1}}方法会比较数量,材料(或类型),持久性和元数据。仅通过提供ItemStack创建新的Material时,ItemStack的默认金额为1,该项目将不等于包含多张纸币的任何ItemStack

从库存中删除钞票的方法可以正常工作,但如果找不到至少一个包含单个的库存槽,则行if (player.getInventory().contains(item)) {会停止执行代码钞票(因为contains(ItemStack)方法的工作方式如上所述)。所以,正如你的代码现在一样,它甚至可以从包含堆叠(多张)钞票的插槽中正确地移除物品,如果库存也包含一张钞票(但如果库存仅包含堆叠的钞票则不起作用)。 p>

要解决此问题,您可以简单地删除if检查。要仍然知道项目的删除是否成功(如果找到至少一个钞票并随后删除,则为AKA),您可以检查removeItem(ItemStack)方法的返回类型,该方法是包含方法项的HashMap是能够删除。如果操作成功,地图将为空,否则,它将包含您尝试删除的单张钞票。

以下是代码的样子:

HashMap<Integer, ItemStack> result = player.getInventory().removeItem(item); // Item is the banknote with an amount of 1

if (result.isEmpty()) { // Removal operation was successful, send player confirmation and deposit
    econ.depositPlayer(player, 5);
    player.sendMessage(ChatColor.GREEN + "You have deposited a $5 banknote and $5 have been added to your acccount!");
}

// Optionally you can add an else statement if you want to tell the player that no banknotes were found

答案 1 :(得分:0)

获取玩家库存并检查项目是否存在与您设置的自定义项目名称itemmeta代表自定义名称或附魔或基本上的知识是的

答案 2 :(得分:-1)

我的猜测是contains方法使用equalsequals以实现项目大小的方式实现。所以我只是手动迭代这个集合来找到这个特定项目的ItemStack。