Java 为什么';添加(0,1,0)在上面一个街区设置一个新位置?

Java 为什么';添加(0,1,0)在上面一个街区设置一个新位置?,java,location,minecraft,bukkit,Java,Location,Minecraft,Bukkit,我想,如果玩家破坏一个区块,也破坏上面的区块,但是这个代码只会删除原始区块(brokenBlock),甚至不会破坏上面的区块 我做错了什么 @EventHandler public void onDestroy(BlockBreakEvent event) { Player player = event.getPlayer(); if (player.getItemInHand().getType() == Material.WOOD_PICKAXE) {

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

经过一些实验,我发现了问题,但没有找到答案

我把上面的代码缩短了,这样读起来更方便,但是原始代码包含两个breaknatural()方法。当我尝试同时执行这两个或更多方法时,它的行为异常,不再工作

这是真正的代码:

@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();
    }
}
注意:由于DMCA请求删除了Bukkit,现在无法获得指向CraftBukkit代码的资源的相关链接,它们将链接到Bukkit流血,并受到链接限制

与您的想法相反,对象不是不可变的(正如对象的不可变性,而不是注释)。首先,这里有以下的源代码:

正如您所看到的,字段在这个过程中会发生变化并返回自身。这是因为位置操作为了提高效率而重用自身,而不必调用
new
构造和缓存对象

您最好在每次更改它们时使用它们:

/* (BlockBreakEvent event) */ {
    Location brokenBlock = event.getBlock().getLocation();

    for (int i = 1; i < 16; i++)
        brokenBlock.add(0, i, 0).getBlock().breakNaturally();
}
/*(BlockBreakEvent事件)*/{
Location brokenBlock=event.getBlock().getLocation();
对于(int i=1;i<16;i++)
添加(0,i,0).getBlock().breakNaturally();
}

我们都不记得整个Minecraft API。我建议阅读一篇javadoc,询问我们关于javadoc中您不理解或不期望的任何部分。您的代码看起来是正确的,您确定已添加并注册了该事件吗?考虑在函数中添加日志。好的,我现在正在尝试。@Unihedron抱歉它还没有结束:P你有什么想法吗?谢谢你,先生,这个答案确实是我想要的答案:)还有一些有用的信息。
/* (BlockBreakEvent event) */ {
    Location brokenBlock = event.getBlock().getLocation();

    for (int i = 1; i < 16; i++)
        brokenBlock.add(0, i, 0).getBlock().breakNaturally();
}