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,但显然不建议这样做。
我是 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,但显然不建议这样做。