Войти или зарегистрироваться

Cooldown

VaNnOrus

Старожил
Пользователь
Баллы
123
Доброго времени суток.
Собственно вопрос - Как правильно сделать кулдаун на ввод команды?
 
Че-то я не догоняю, как этим пользоваться?
Там же есть пример:
Код:
  PlayerCooldown pc = Cooldown.getCooldown("WandCooldown", player.getName(), 15000);
  if(pc.isOver())
      let player use magic wand
      pc.reset();
  else
  player.sendMessage("You have: " + pc.getTimeLeft() + "Seconds left" );
  }
"WandCooldown" - имя кулдауна
player.getName() - имя игрока, для которого он назначается
15000 - 15 секунд
 
Там же есть пример:
Код:
  PlayerCooldown pc = Cooldown.getCooldown("WandCooldown", player.getName(), 15000);
  if(pc.isOver())
      let player use magic wand
      pc.reset();
  else
  player.sendMessage("You have: " + pc.getTimeLeft() + "Seconds left" );
  }
"WandCooldown" - имя кулдауна
player.getName() - имя игрока, для которого он назначается
15000 - 15 секунд
А как начать сам отсчет?
Understand. Спасибо
Если ввести просто
Код:
PlayerCooldown pc = Cooldown.getCooldown("WandCooldown", player.getName(), 15000);
  if(pc.isOver())
То отсчёт даже не начнётся и сразу закончится.
 
Там в примере просто не закомменчены строки с пояснениями. Вот рабочий вариант:
Код:
PlayerCooldown pc = Cooldown.getCooldown("WandCooldown", player.getName(), 15000);
if(pc.isOver()){
  pc.reset();
}else{player.sendMessage("You have: " + pc.getTimeLeft() + "Seconds left" );}
Разумеется для работы нужно как минимум иметь класс "Cooldown", взятый по ссылке второго поста, и объект "player".
 
Разумеется для работы нужно как минимум иметь класс "Cooldown", взятый по ссылке второго поста, и объект "player".
И то, и другое имеется. Вот мой код:
Код:
PlayerCooldown pc = Cooldown.getCooldown("ThiefSearch", player.getName(), 3000);
                            if(pc.isOver()){
                                  sender.sendMessage(ChatColor.YELLOW + "Вы скрылись от стражи");
                                  this.getConfig().set("Guards.wanted." + sender.getName(), 0);
                                  this.getConfig().set("Thiefs." + sender.getName() + ".target." + player.getName(), 0);
                                  this.saveConfig();
                                  pc.reset();
                              }
 
И то, и другое имеется. Вот мой код:
Код:
PlayerCooldown pc = Cooldown.getCooldown("ThiefSearch", player.getName(), 3000);
                            if(pc.isOver()){
                                  sender.sendMessage(ChatColor.YELLOW + "Вы скрылись от стражи");
                                  this.getConfig().set("Guards.wanted." + sender.getName(), 0);
                                  this.getConfig().set("Thiefs." + sender.getName() + ".target." + player.getName(), 0);
                                  this.saveConfig();
                                  pc.reset();
                              }
И в чем проблема?
 
Не работает Cooldown вот код:
Java:
else if(cmd.getName().equalsIgnoreCase("stats")){
Player player = null;
   try{
   player = (Player)sender;
   }catch (Exception e){
     sender.sendMessage(ChatColor.RED + "Only players can use this command!");
     return true;
   }
   PlayerCooldown pc = Cooldown.getCooldown("StatsCooldown", player.getName(), 15000);
   if(pc.isOver()){
sender.sendMessage(ChatColor.DARK_PURPLE + "Статистика игрока " + player.getDisplayName());
   pc.reset();
   }else{
   sender.sendMessage("You have: " + pc.getTimeLeft() + "Seconds left" );
   }
return true;
}
 
Я на скорую руку делал такой класс:
Код:
public class Cooldown {
    private String player;
    private long cooldown;
    private String key;
   
    public static HashMap<String, Cooldown> cooldowns = new HashMap<String, Cooldown>();
 
    public Cooldown(String player, long cooldown, String key) {
        this.player = player;
        this.cooldown = cooldown;
        this.key = key;
    }
 
    public String getPlayer() {
        return this.player;
    }
 
    public long getCooldown() {
        return this.cooldown;
    }
 
    public String getKey() {
        return this.key;
    }
 
    public static void setCooldown(String player, long cooldown, String title) {
        cooldowns.put(player + title, new Cooldown(player, System.currentTimeMillis() + cooldown, title));
    }
 
    public static boolean hasCooldown(String player, String title) {
        if (cooldowns.get(player + title) == null) {
            return false;
        }
        if (getCooldown(player, title) == 0) {
            return false;
        }
        if (cooldowns.get(player + title).getCooldown() > System.currentTimeMillis()) {
            return true;
        }
        return false;
    }
 
    public static long getCooldown(String player, String title) {
        return (cooldowns.get(player + title).getCooldown() - System.currentTimeMillis()) / 1000;
    }
}
 
Не работает Cooldown вот код:
Java:
else if(cmd.getName().equalsIgnoreCase("stats")){
Player player = null;
  try{
  player = (Player)sender;
  }catch (Exception e){
    sender.sendMessage(ChatColor.RED + "Only players can use this command!");
    return true;
  }
  PlayerCooldown pc = Cooldown.getCooldown("StatsCooldown", player.getName(), 15000);
  if(pc.isOver()){
sender.sendMessage(ChatColor.DARK_PURPLE + "Статистика игрока " + player.getDisplayName());
  pc.reset();
  }else{
  sender.sendMessage("You have: " + pc.getTimeLeft() + "Seconds left" );
  }
return true;
}
Извиняйте, экстрасенсы в отпуске. Возможно у вас дело и не доходит до кулдауна, ставьте якоря по коду и проверяйте в каком месте ошибка.
 
Зачем всё так усложнять? Ведь можно использовать обычный Scheduler
 
Зачем всё так усложнять? Ведь можно использовать обычный Scheduler
Пользователь ввел команду и получил то, что просил только через минуту? Бред.
Вернее это совершенно разные функции, когда-то нужна задержка от действия до использования, а когда-то задержка между использованиями.
 
Пользователь ввел команду и получил то, что просил только через минуту? Бред.
Вернее это совершенно разные функции, когда-то нужна задержка от действия до использования, а когда-то задержка между использованиями.

Процитированное мной сообщение бред. Пользоваться надо уметь.
 
Процитированное мной сообщение бред. Пользоваться надо уметь.
Чем пользоваться? Запуском через определенное время? Просветите меня, такого неумеющего, как можно сделать таймаут между действиями при помощи отложенного запуска.
 
Чем пользоваться? Запуском через определенное время? Просветите меня, такого неумеющего, как можно сделать таймаут между действиями при помощи отложенного запуска.
Объясни по-человечески
 
Объясни по-человечески
Что тут объяснять? Вы понимаете разницу между "действием через определенное время после ввода"(то что делает Scheduler) и "недоступностью повторного использования определенное время"?
 
Что тут объяснять? Вы понимаете разницу между "действием через определенное время после ввода"(то что делает Scheduler) и "недоступностью повторного использования определенное время"?
Возможно он хранит хэшмап <Игрок, булеан> и когда игрок заюзает команду то переводит булеан в true, и шедулит таск который через какое-то время возвращает этот булеан в false. А при вводе команы проверяет.
Но это как-то по рачински
 
Назад
Верх