Bukkit:更换方块只会掉落新方块的物品

Bukkit: Replacing block just drops item of new block

我是 Java 和 Spigot-API 的新手。我想做一个 BlockBreakEvent 来检测 GOLD_ORE 方块是否被玩家摧毁。如果是这样,它应该用 STONE 块替换那个 GOLD_ORE 块。但是它不起作用,它没有替换方块,而是掉落了当然是鹅卵石的物品。

我的代码:

public class GoldOreListener implements Listener {

    @EventHandler
    public void onGoldOreDestroyed(BlockBreakEvent event)
    {
        Block block = event.getBlock();
        Player player = event.getPlayer();

        Material material = block.getType();

        if (material == Material.GOLD_ORE)
        {
            Location locationOfBlock = block.getLocation();
            Material newMaterial = Material.STONE;

            System.out.println(locationOfBlock.getBlock());
            locationOfBlock.getBlock().setType(newMaterial);
        }

    }
}

locationOfBlock.getBlock() 的输出:

CraftBlock{pos=BlockPosition{x=-158, y=83, z=303},type=GOLD_ORE,data=Block{minecraft:gold_ore},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1507c3c3}

这是正常的,因为这个事件是在块真正被打破之前调用的。因此,更改事件调用中的块将不会执行任何操作,并且会被实际效果覆盖。

你应该这样取消活动:

@EventHandler
public void onGoldOreDestroyed(BlockBreakEvent event) {
    Block block = event.getBlock();
    Material material = block.getType();
    if (material == Material.GOLD_ORE) {
         event.setCancelled(true); // cancel here
         block.setType(Material.STONE);
    }
}

你也可以等一个tick,但显然不建议这样做。