将块下降添加到玩家库存

时间:2015-08-06 06:33:15

标签: java bukkit

将以下代码放在BlockBreakEvent监听器下,我试图将该块作为ItemStack提供给播放器。

Player p = e.getPlayer();
Block b = e.getBlock();
ItemStack im = getDrops(b);
p.getInventory().addItem(im);
p.updateInventory();
private final ItemStack getDrops(Block b)
{
    for(ItemStack im : b.getDrops())
    {
        return im;
    }
    return null;
}

然而,这给了没有数据的块。

由于b.getDrops()Collection<ItemStack>,我接着尝试了这个并没有成功:

private final ItemStack getDrops(Block b)
{
    ItemStack item = null;
    for(ItemStack im : b.getDrops())
    {
        item = im;
    }
    return item;
}

我的问题:

  • 如何将该区块作为ItemStack包含块MaterialData
  • 为什么这不能正常工作?

1 个答案:

答案 0 :(得分:1)

Block.getDrops()会返回执行包含数据的ItemStack个对象。

我发现您的代码存在许多问题:

  1. 您的第一个方法只会返回第一个元素。

    private final ItemStack getDrops(Block b)
    {
        for(ItemStack im : b.getDrops())
        {
            return im;
        }
        return null;
    }
    
  2. 您的第二种方法只会返回 last 元素。

    private final ItemStack getDrops(Block b)
    {
        ItemStack item = null;
        for(ItemStack im : b.getDrops())
        {
            item = im;
        }
        return item;
    }
    
  3. 另请注意,某些街区在被毁时可能会退化(如草到泥土)。

  4. 我写了这段代码。 Inventory.addItem(ItemStack...)实现了Java的varargs功能,因此您可以传递一个数组或一系列参数。

    PlayerInventory inventory = event.getPlayer().getInventory();
    Collection<ItemStack> drops = event.getBlock().getDrops();
    inventory.addItem(drops.toArray(new ItemStack[drops.size()]));