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);
}
}
Также можно подождать один тик, но делать это явно не рекомендуется.