检查玩家是否在移动

Check if a player is moving or not

我正在为一个事件创建一个插件,这个事件只是:当你停止移动时,你就松了。我创造了一切,但我检查玩家是否移动不起作用:

我尝试制作一个数组,当玩家移动事件时它被添加,但它不起作用,

@EventHandler
public static void OnPlayerMoov(PlayerMoveEvent e) {
    if(!playerHaveMooved.contains(e.getPlayer())) {
        playerHaveMooved.add(e.getPlayer());
    }
}

public static boolean isMoving(Player p){
    System.out.println(Respawn.playerHaveMooved.contains(p));
    return Respawn.playerHaveMooved.contains(p);
}

我尝试使用速度;没用,

public static boolean isMoving(Player p){
    return (p.getVelocity().length() == 0);
}

没用。当我移动时它会杀死我。

你有解决办法吗?

第一个不起作用,因为您只是检查玩家是否已经移动了一次,这将始终为真。

第二个关于速度检查,例如玩家被击退时。

第一个解决方案

保存最后一次移动,每隔几次检查是否停止移动。

在这个例子中,我将强制玩家每秒移动一次。

private final HashMap<Player, Long> timeMove = new HashMap<>(); // map for data

@Eventhandler
public void onMove(PlayerMoveEvent e) {
   timeMove.put(e.getPlayer(), System.currentTimeMillis()); // update last move
}

public void startChecking(JavaPlugin pl) {
   pl.getServer().getScheduler().runTaskTimer(pl, () -> {
      long current = System.currentTimeMillis();
      for(Player p : Bukkit.getOnlinePlayers()) {
         long last = timeMove.getOrDefault(p, 0);
         long diff = current - last;
         if(diff > 1000) { // 1000 = second
            // player don't move
         }
      }
   }, 20, 20);
}

第二种解决方案

从上次和当前位置开始每 X 次检查一次

private final HashMap<Player, Location> lastLoc = new HashMap<>(); // map for data

public void startChecking(JavaPlugin pl) {
   pl.getServer().getScheduler().runTaskTimer(pl, () -> {
      for(Player p : Bukkit.getOnlinePlayers()) {
         Location lastPlayerLoc = lastLoc.get(p); // get loc, or keep null if not registered
         if(lastPlayerLoc != null) {
            double distance = lastPlayerLoc.distance(p.getLocation());
            if(distance == 0.0) {
               // here the player don't move
               continue; // go to next player
            }
         }
         lastLoc.put(p, p.getLocation()); // update loc
      }
   }, 20, 20);
}