Bukkit Wait / Delay help (Bukkit Runnable) - PullRequest
0 голосов
/ 28 мая 2018

У меня возникли некоторые проблемы с использованием исполняемого Bukkit.Я пытался заставить его работать, но он просто выбрасывает ошибки.Вот что я хотел бы

public class FlyE implements Listener {

  @EventHandler
  public void onPlayerMovement(PlayerMoveEvent e) {
      Player p = e.getPlayer();
      double y1 = p.getLocation().getY();
      // wait 1 second
      double y2 = p.getLocation().getY();
      double yf = y1 - y2;
      Bukkit.broadcastMessage(p + " Increase = " + yf);   

  }
}

Этот код предназначен для получения пользовательских Y координат, подождать секунду, получить его снова, а затем рассчитать увеличение.Однако, как бы я ни пытался использовать BukkitRunnable, меня это просто смущает.Я надеялся, что кто-нибудь может рассказать мне, как преобразовать приведенное ниже в Runkable Bukkit, который собирает y1, ждет 20 тиков, а затем собирает y2.

1 Ответ

0 голосов
/ 30 мая 2018

Событие перемещения игрока вызывается каждый раз, когда игрок перемещается.Вам нужно только один раз запустить планировщик Bukkit, и он будет работать непрерывно.Я не уверен, как вы хотите выбрать своего игрока, так что это может быть не совсем то, чего вы хотите достичь, но чтобы запустить планировщик, поместите его в метод onEnable ().

public class MyPlugin extends JavaPlugin implements Listener {

    private HashMap<String, Integer> lastY = new HashMap<>(); //Stores the last y location for an arbitrary number of users. The map key (String) is the user's name and the value (Integer) is the user's last Y coord

    @Override
    public void onEnable(){
        //Start the timer asynchronously because it doesn't need to run on the main thread and the time will also be more accurate
        Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() {

            @Override
            public void run() {
                for (Player player : Bukkit.getOnlinePlayers()) { //Loop through all the players on the server
                    int y = player.getLocation().getBlockX();
                    player.sendMessage("Increase = " + (y - lastY.getOrDefault(player.getName(), 0))); //Display the increase in height using the stored value or 0 if none exists
                    lastY.put(player.getName(), y); //Replace their previous y coordinate with the new one
                }
            }

        }, 0, 20L);
    }

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent e){
        lastY.remove(e.getPlayer().getName()); //Remove stored data for player
    }

}

HashMapЗдесь можно сохранить координату y для всех игроков на сервере и получить к ним эффективный доступ.Однако не забудьте удалить сохраненные данные, когда они больше не нужны (то есть игрок выходит из игры)

...