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

Как зафиксировать двойной Shift? ДаблШифт

Тема в разделе "Разработка плагинов для новичков", создана пользователем Evgesha728, 7 фев 2019.

Статус темы:
Закрыта.
  1. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    Привет. Мне нужно узнать, если игрок сделал двойной шифт, то abc
     
  2. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Слушаешь PlayerToggleSneakEvent, запоминаешь время последнего sneaking. Если время между текущим и предыдущим sneaking меньше, скажем, секунды - выполняешь действия
     
  3. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    По поводу сохранения. В Лист и туда время?
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Удобнее всего будет HashMap<Player, Long>
     
  5. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    Стоит ли использовать таймер? Если же игрок там останется, это, по сути, лишняя трата памяти
     
  6. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для чего таймер? Чтобы удалять запись о игроке через некоторое время?
    Оно того не стоит.
    Целых 8 байт памяти на душу, отвратительно.
    Главное при выходе удалять, вот и всё
     
  7. php5master

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

    Баллы:
    66
    ConcurrentHashMap<Player, Long> map = new ConcurentHashMap()<>;

    Настоятельно советую изучить этот тип, в spigot`е он нужен постоянно. HashMap не потокобезопасен => есть вероятность, что он выкинет exception при записи с нескольких потоков.

    Зачем с таймером морочиться? Сказали же словами сделать примерно так:
    PHP:
    if(map.containsKey(player)){
      
    long lostTime System.nanoTime() - map.get(player);
      
    map.remove(player);
      if(
    lostTime 1_000_000) {
        
    handleDoubleSneak(player);
      }
    }else{
      
    map.put(playerSystem.nanoTime());
    }
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это при каких обстоятельствах ты собрался записывать в мапу в нескольких потоках? :D
    Не нужен твой конкуррент совершенно.
    Нано не надо, миллисек хватит.
    Котэинс тоже не надо )
     
  9. Exception_Prototype

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

    Баллы:
    96
    Нахрена пихать везде ConcurentHashMap?
    Если изменение данных из других потов не будет, то HashMap хватит.
     
  10. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    Эта хрень даже не работает)
    https://pastebin.com/wDsiMYfn

    На System.out... не обращайте внимания, игралась
     
    Последнее редактирование: 7 фев 2019
  11. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Глупый что ли? Зачем тебе 3 млн миллисекунд?
     
  12. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    C того раза осталось. А вообще, перевела в секунды, однако реакция такая же
     
  13. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Господи, как всё сложно.
    Разбирайся...
    PHP:
        private Map<PlayerLonglastSneak = new HashMap<>();

        @
    EventHandler
        
    private void on(PlayerToggleSneakEvent event) {
            if (!
    event.isSneaking()) return; // Не интересуют моменты, когда игрок поднимается
            
    long current System.currentTimeMillis(); // Текущее время в мс
            
    Long previous this.lastSneak.put(event.getPlayer(), current); // Складывает в мапу новое значение и возвращает предыдущее
            
    if (previous == null) return; // Игрок присел первый раз
            
    if (current previous 500) return; // Прошло более 0.5 сек с прошлого приседания
            
    event.getPlayer().sendMessage("Двойное приседание");
        }

        @
    EventHandler
        
    private void on(PlayerQuitEvent event) {
            
    this.lastSneak.remove(event.getPlayer());
        }
     
  14. Автор темы
    Evgesha728

    Evgesha728 Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    Evgesha728
    Спасибо, теперь поняла
     
Статус темы:
Закрыта.

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