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