检查延迟后区块是否仍在世界中

问题描述 投票:0回答:1

我想检查放置的块在短暂延迟后是否仍然存在并执行命令

我尝试过睡眠,但它只是给出了延迟之前存在的块

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);
          }
        }
      }
java bukkit
1个回答
0
投票

您应该永远在插口上使用

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 秒。
© www.soinside.com 2019 - 2024. All rights reserved.