为什么Location.add(0,1,0)没有设置一个新的位置?

时间:2014-09-13 20:59:18

标签: java location minecraft bukkit

我想,如果玩家打破了一个区块,也打破了上面的区块,但是这段代码只会丢弃原始区块(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();
    }
}

1 个答案:

答案 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();
}