Bukkit: при замене блока просто выпадает элемент нового блока

Я новичок в Java и Spigot-API. я хочу сделать BlockBreakEventкоторый определяет, был ли блок уничтожен игроком. Если это так, он должен заменить это GOLD_OREблок с STONEблокировать. Однако это не работает, и вместо замены блока выпадает предмет, который, конечно же, является булыжником.

Мой код:

      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}

1 ответ

Это нормально, потому что это событие вызывается до того, как блок действительно сломается. Таким образом, изменение блока в вызове события ничего не сделает и будет переопределено реальным эффектом.

Вы должны отменить событие следующим образом:

      @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);
    }
}

Также можно подождать один тик, но делать это явно не рекомендуется.

Другие вопросы по тегам