我想,如果玩家打破了一个区块,也打破了上面的区块,但是这段代码只会丢弃原始区块(brokenBlock
),甚至不会打破上面的区块...... 击>
我做错了什么?
@EventHandler
public void onDestroy(BlockBreakEvent event)
{
Player player = event.getPlayer();
if (player.getItemInHand().getType() == Material.WOOD_PICKAXE)
{
Location brokenBlock = event.getBlock().getLocation();
Location up = brokenBlock.add(0, 1, 0);
up.getBlock().breakNaturally();
}
}
击> <击> 撞击>
经过一些实验,我发现了问题,但没有找到答案。
我将上面的代码缩短了,所以它的读取效果更好,但原始版本包含两个breakNaturally()方法。当我尝试执行两个或更多个时,它的行为很奇怪而且不再起作用。
以下是真实的代码:
@EventHandler
public void onDestroy(BlockBreakEvent event)
{
Player player = event.getPlayer();
if (player.getItemInHand().getType() == Material.WOOD_PICKAXE)
{
Location brokenBlock = event.getBlock().getLocation();
Location up = brokenBlock.add(0, 1, 0);
Location down = brokenBlock.add(0, -1, 0);
up.getBlock().breakNaturally();
down.getBlock().breakNaturally();
}
}
答案 0 :(得分:0)
注意:由于Bukkit被DMCA请求删除,现在无法获得CraftBukkit代码资源的相关链接,它们将链接到Bukkit-Bleeding并受到链接腐烂。
与您的信念相反,Location
个对象不 @Immutable
(如对象的不变性,而不是注释)。首先,这里有Location.add(double, double, double)
的源代码:
/**
* Adds the location by another. Not world-aware.
*
* @see Vector
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @return the same location
*/
public Location add(double x, double y, double z) {
this.x += x;
this.y += y;
this.z += z;
return this;
}
如您所见,字段会更改并在此过程中返回自身。这是因为位置操作重用自身以提高效率,而不必调用new
构造和缓存对象。
每次更改时,最好不要使用它们:
/* (BlockBreakEvent event) */ {
Location brokenBlock = event.getBlock().getLocation();
for (int i = 1; i < 16; i++)
brokenBlock.add(0, i, 0).getBlock().breakNaturally();
}