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

Статус
Закрыто для дальнейших ответов.

Evgesha728

Новичок
Пользователь
Баллы
6
Имя в Minecraft
Evgesha728
Привет. Мне нужно узнать, если игрок сделал двойной шифт, то abc
 
Слушаешь PlayerToggleSneakEvent, запоминаешь время последнего sneaking. Если время между текущим и предыдущим sneaking меньше, скажем, секунды - выполняешь действия
 
Слушаешь PlayerToggleSneakEvent, запоминаешь время последнего sneaking. Если время между текущим и предыдущим sneaking меньше, скажем, секунды - выполняешь действия
По поводу сохранения. В Лист и туда время?
 
Стоит ли использовать таймер? Если же игрок там останется, это, по сути, лишняя трата памяти
Для чего таймер? Чтобы удалять запись о игроке через некоторое время?
Оно того не стоит.
Целых 8 байт памяти на душу, отвратительно.
Главное при выходе удалять, вот и всё
 
Удобнее всего будет HashMap<Player, Long>
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(player, System.nanoTime());
}
 
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(player, System.nanoTime());
}
Это при каких обстоятельствах ты собрался записывать в мапу в нескольких потоках? 😁
Не нужен твой конкуррент совершенно.
Нано не надо, миллисек хватит.
Котэинс тоже не надо )
 
Нахрена пихать везде ConcurentHashMap?
Если изменение данных из других потов не будет, то HashMap хватит.
 
Это при каких обстоятельствах ты собрался записывать в мапу в нескольких потоках? 😁
Не нужен твой конкуррент совершенно.
Нано не надо, миллисек хватит.
Котэинс тоже не надо )
Эта хрень даже не работает)
https://pastebin.com/wDsiMYfn

На System.out... не обращайте внимания, игралась
 
Последнее редактирование:
Эта хрень даже не работает)
https://pastebin.com/wDsiMYfn

На System.out... не обращайте внимания, игралась
Господи, как всё сложно.
Разбирайся...
PHP:
    private Map<Player, Long> lastSneak = 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());
    }
 
Господи, как всё сложно.
Разбирайся...
PHP:
    private Map<Player, Long> lastSneak = 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());
    }
Спасибо, теперь поняла
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх