我想检查放置的块在短暂延迟后是否仍然存在并执行命令
我尝试过睡眠,但它只是给出了延迟之前存在的块
public class BlockListener implements Listener {
@EventHandler
public void check(BlockPlaceEvent e)
{
Material blockType = e.getBlockPlaced().getType();
int locationX = e.getBlockPlaced().getLocation().getBlockX();
int locationY = e.getBlockPlaced().getLocation().getBlockY();
int locationZ = e.getBlockPlaced().getLocation().getBlockZ();
String locationXb = String.valueOf(locationX);
String locationYb = String.valueOf(locationY);
String locationZb = String.valueOf(locationZ);
World world = e.getPlayer().getWorld();
if ((blockType == Material.PLAYER_HEAD) || (blockType == Material.PLAYER_WALL_HEAD))
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException ex)
{
}
Material block = world.getBlockAt(locationX, locationY, locationZ).getType();
if((block == Material.PLAYER_WALL_HEAD) || (block == Material.PLAYER_HEAD)){
//empty
}
else {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
}
}
}
您应该永远在插口上使用
Thread.sleep
方法。它停止了所有服务器。
您需要使用调度程序(教程 - Javadoc:
BukkitScheduler
):
@EventHandler
public void check(BlockPlaceEvent e) {
Material blockType = e.getBlockPlaced().getType();
int locationX = e.getBlockPlaced().getLocation().getBlockX();
int locationY = e.getBlockPlaced().getLocation().getBlockY();
int locationZ = e.getBlockPlaced().getLocation().getBlockZ();
String locationXb = String.valueOf(locationX);
String locationYb = String.valueOf(locationY);
String locationZb = String.valueOf(locationZ);
World world = e.getPlayer().getWorld();
if ((blockType == Material.PLAYER_HEAD) || (blockType == Material.PLAYER_WALL_HEAD)) {
Bukkit.getScheduler().runTaskLater(MyPlugin.getInstance(), () -> {
Material block = world.getBlockAt(locationX, locationY, locationZ).getType();
if ((block == Material.PLAYER_WALL_HEAD) || (block == Material.PLAYER_HEAD)) {
//empty
} else {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command);
}
}, 20);
}
}
地点:
MyPlugin.getInstance()
是获取 JavaPlugin 的实例,它也通常被称为 plugin
变量。() -> {}
是将要运行的内容20
是服务器应该等待的时间(以滴答为单位)。 20 个刻度 = 1 秒。