1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Стартап Простейшие кулдауны для ваших команд

Тема в разделе "Разработка плагинов для новичков", создана пользователем AlexQFG, 29 июл 2017.

Метки:
?

Будет ли данная тема полезна новичкам?

  1. Да

    9 голосов
    56,3%
  2. Нет

    5 голосов
    31,3%
  3. Не знаю

    2 голосов
    12,5%
  1. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Решил написать этот стартап, так-как на русском языке практически ничего нету (Есть, но без нормальных пояснений). Второй причиной является то, что когда я сам начинал кодить плагины, я искал темы на русском, и, в итоге, мало чего находил. Сейчас я стал умнее и ищу все, что мне нужно, исключительно на английском. Но, как известно, многие новички вряд-ли знают английский на столько хорошо, чтобы самим читать гайды, при этом понимая, что же там написано.

    Ближе к сути. В этой теме я расскажу новичкам, как-же делать простейшие(!) кулдауны.

    Код:
    HashMap<String, Integer> cooldown = new HashMap<String, Integer>();
    boolean onCommand(CommandSender s, Command cmd, String label, String args[]){
     switch(cmd.getName().toLowerCase()){
        case "command1":
          if( cooldown.get(s.getName())!=null && cooldown.get(sender.getName())>System.currentTimeMillis() {
            s.sendMessage("Подождите 10 секунд, перед тем, как использовать команду снова");
            return true;
          }
          else сooldown.remove(s.getName());
          s.sendMessage("Это моя тестовая команда");
          cooldown.put(s.getName(), System.currentTimeMillis() + 10000);
          break;
        case "commandwithoutcooldown":
          s.sendMessage("Это моя тестовая команда без кулдауна");
          break;
      }
    }
    Теперь пояснения:
    Код:
    HashMap<String, Integer> cooldown = new HashMap<String, Integer>();
    Создаем хэшмап с именем cooldown. Что такое хэшмап? Это набор значений типа ключ:объект. Вызывая ключ мы получим объект. В таких вот (<>) скобочках мы пишем типы ключа и объекта (Так-же можно использовать конструкцию <String, HashMap<String, String>>, но сейчас не об этом)

    HashMap имеет несколько основных методов, которых для начала должно хватить:
    put (Ключ, Объект) - Добавляет значение в хэшмап.
    get (Ключ) - Вызвать ключ, после чего получим объект
    remove (Ключ) - Удалить ключ вместе с объектом

    Как это все работает в коде:
    1. Проверяем, установлен ли кулдаун для данного игрока:
    Код:
    if( cooldown.get(s.getName()) != null ...
    2. Проверяем, действителен ли еще наш кулдаун: (Если он все еще больше системного времени, то да)
    Код:
    ... && cooldown.get(s.getName()) > System.currentTimeMillis()){ ...
    3. Если кулдан не действителен, то удаляем его (Не обязательно)
    Код:
    else cooldown.remove(s.getName());
    4. После выполнения всей команды создаем новый кулдаун;
    Код:
    cooldown.put(s.getName(), System.currentTimeMillis() + 10000);
    У некоторых может возникнуть вопрос: Что за число - 10000? Все просто - это наше время в мили секундах (секунды*1000). Вместо этого числа можно использовать кастомное значемие из конфига:
    Код:
    cooldown.put(s.getName(), System.currentTimeMillis() + getConfig().getInt("cooldownTime"));
    Эту тему я создал так же для того, чтобы новички разобрались в понятии HashMap, ведь в начале для меня это было что-то заоблачное.

    Это, в принципе, и все. Не так уж и трудно, да? Я знаю, что лучше делать кулдауны через scheduler, но для новичков в кодинге на баките и такого будет достаточно.
     
    Последнее редактирование: 29 июл 2017
  2. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Создавать HashMap надо вне метода, а так он будет перезаписываться каждый раз, нет?
     
  3. Slavkaa

    Slavkaa Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    +
     
  4. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    Не далеко ушел.
     
  5. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Да. Я не самый лучший программист, но чтобы писать плагины вроде билдбатла моих знаний хватает.
    PS. Мне интересно, откуда же ты знаешь, на сколько хорошо я знаю код?
     
  6. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Знаю. Я писал этот код на скорую руку, вот и напортачил.
     
  7. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Баллы:
    76
    Тогда и тут поправь.
    Код:
     switch(cmd.getName().toLowerCase()){
        case "myCommand1":
     
  8. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Уже ночь, я может немного туплю, но что тут не так?
     
  9. xDark

    xDark Активный участник Пользователь

    Баллы:
    96
    проверка на название команды не нужна.
     
  10. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Рассчитано на то, что будут еще команды, чтобы пользователь при желании мог скопировать и просто по добавлять те команды, которые ему нужны.
     
  11. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    .toLowerCase() а проверяешь на myCommand1, чуток заплутать можно
     
    Последнее редактирование: 30 июл 2017
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Нате вам.

    Код:
        static WeakHashMap<Player, Long> usertime = new WeakHashMap<Player, Long>();
        static boolean check(Player user, long tmp) {
            long time = System.currentTimeMillis();
            Long last = usertime.get(user);
            if(last!= null) {
                if((time-last)<tmp) {
                    return false;
                }
            }
            usertime.put(user, time);
            return true;
        }
    Где ретурн false можно отправлять сообщение игроку.
     
  13. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
  14. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Чет больно жирно для тупо задержки.
     
  15. Автор темы
    AlexQFG

    AlexQFG Новичок

    Баллы:
    6
    Имя в Minecraft:
    TwixGo
    Конечно, спасибо за классы, но тупо копипастом ничему научиться не получится. Чтобы узнать что-то новое человек должен сам это искать и впихивать в свой код.
    Я эту тему писал не для "топ" кодеров, а для новичков.
     
  16. xDark

    xDark Активный участник Пользователь

    Баллы:
    96

Поделиться этой страницей