将以下代码放在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
?答案 0 :(得分:1)
Block.getDrops()
会返回执行包含数据的ItemStack
个对象。
我发现您的代码存在许多问题:
您的第一个方法只会返回第一个元素。
private final ItemStack getDrops(Block b)
{
for(ItemStack im : b.getDrops())
{
return im;
}
return null;
}
您的第二种方法只会返回 last 元素。
private final ItemStack getDrops(Block b)
{
ItemStack item = null;
for(ItemStack im : b.getDrops())
{
item = im;
}
return item;
}
另请注意,某些街区在被毁时可能会退化(如草到泥土)。
我写了这段代码。
Inventory.addItem(ItemStack...)
实现了Java的varargs功能,因此您可以传递一个数组或一系列参数。
PlayerInventory inventory = event.getPlayer().getInventory();
Collection<ItemStack> drops = event.getBlock().getDrops();
inventory.addItem(drops.toArray(new ItemStack[drops.size()]));