Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите PlayerInteractEvent где клик срабатывает два раза

Метки:
Теги Теги
event playerinteractevent клик

Dulcha

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
iygiuyg
Дело с фейерверками. Вроде как я обрабатываю руку и проверяю её если вначале проверяю:
if (event.getHand() == EquipmentSlot.HAND) {
} else if (event.getHand() == EquipmentSlot.OFF_HAND) {}
Но почему-то на офф хенде кликается по одному разу а вот главная рука за 1 клик срабатывает 2 раза.
Конкретно такую странность выдаёт при запуске фейерверка. Код внутри двух условий абсолютно одинаковый. Что не так?
 
У игрока две руки, ивент срабатывает на обе, ищите ошибку в ваших проверках на руку.
 
У игрока две руки, ивент срабатывает на обе, ищите ошибку в ваших проверках на руку.
как раз предоставленны. Внутри условия нету ничего что связано с руками. только элементы исчисления :good:
 
как раз предоставленны. Внутри условия нету ничего что связано с руками. только элементы исчисления :good:
Значит с ними и проблема. Без полного кода ничего не сказать тут
 
Значит с ними и проблема. Без полного кода ничего не сказать тут
Код:
                List<String> CDitem = Configuration.getConfig().getStringList("BE_CDII");
                // ДОБАВЯЛЕМ ВИДЫ РУК ДЛЯ ТОГО ЧТОБЫ ПРЕДОТВРАТИТЬ ДВОЙНОЕ НАЖАТИЕ
                if (event.getItem() != null) {

                        ItemStack item = event.getItem();
                        Player player = event.getPlayer();
                        if (CDitem.contains(item.getType().name())) {
                            if (event.getHand() == EquipmentSlot.HAND) {
                                String key = player.getUniqueId() + ":" + item.getType().name();
                                Long coolDownTime = cooldownMap.getOrDefault(key, 0L);
                                Date currentTime = new Date();
                                long diffInMillies = Math.abs(currentTime.getTime() - coolDownTime);
                                long diff = TimeUnit.SECONDS.convert(diffInMillies, TimeUnit.MILLISECONDS);
                                if (diff < 3) {
                                    String pattern = ChatColor.translateAlternateColorCodes('&', Configuration.getConfig().getString("BE_B_CDII_MSG"));
                                    MessageFormat formatter = new MessageFormat(pattern);
                                    String message = formatter.format(new Object[]{3 - diff});
                                    //if (diff != 0) {
                                    player.sendMessage(message);
                                    //
                                    //}
                                    System.out.println("main " + diff);
                                    //
                                    event.setCancelled(true);
                                } else {
                                    cooldownMap.put(key, new Date().getTime());
                                }
                            } else if(event.getHand() == EquipmentSlot.OFF_HAND) {

                                String key = player.getUniqueId() + ":" + item.getType().name();
                                Long coolDownTime = cooldownMap.getOrDefault(key, 0L);
                                Date currentTime = new Date();
                                long diffInMillies = Math.abs(currentTime.getTime() - coolDownTime);
                                long diff = TimeUnit.SECONDS.convert(diffInMillies, TimeUnit.MILLISECONDS);
                                if (diff < 3) {
                                    String pattern = ChatColor.translateAlternateColorCodes('&', Configuration.getConfig().getString("BE_B_CDII_MSG"));
                                    MessageFormat formatter = new MessageFormat(pattern);
                                    String message = formatter.format(new Object[]{3 - diff});
                                    //if (diff != 0) {
                                    player.sendMessage(message);
                                    //
                                    //}
                                    System.out.println("OFFHAND " + diff);
                                    //
                                    event.setCancelled(true);
                                } else {
                                    cooldownMap.put(key, new Date().getTime());
                                }

                            }
                        }
                }
println был добавлен для теста
 
Кажется он срабатывает ещё и для двух случаев: использование предмета в руке и взаимодействие с блоком.
Когда ты тыкаешь предметом по блоку, то он два раза сработает.
 
Кажется он срабатывает ещё и для двух случаев: использование предмета в руке и взаимодействие с блоком.
Когда ты тыкаешь предметом по блоку, то он два раза сработает.
два раза срабатывает именно при полёте на элитрах когда пускаю фейерверк. на блок не срабатывает
 
Код:
                List<String> CDitem = Configuration.getConfig().getStringList("BE_CDII");
                // ДОБАВЯЛЕМ ВИДЫ РУК ДЛЯ ТОГО ЧТОБЫ ПРЕДОТВРАТИТЬ ДВОЙНОЕ НАЖАТИЕ
                if (event.getItem() != null) {

                        ItemStack item = event.getItem();
                        Player player = event.getPlayer();
                        if (CDitem.contains(item.getType().name())) {
                            if (event.getHand() == EquipmentSlot.HAND) {
                                String key = player.getUniqueId() + ":" + item.getType().name();
                                Long coolDownTime = cooldownMap.getOrDefault(key, 0L);
                                Date currentTime = new Date();
                                long diffInMillies = Math.abs(currentTime.getTime() - coolDownTime);
                                long diff = TimeUnit.SECONDS.convert(diffInMillies, TimeUnit.MILLISECONDS);
                                if (diff < 3) {
                                    String pattern = ChatColor.translateAlternateColorCodes('&', Configuration.getConfig().getString("BE_B_CDII_MSG"));
                                    MessageFormat formatter = new MessageFormat(pattern);
                                    String message = formatter.format(new Object[]{3 - diff});
                                    //if (diff != 0) {
                                    player.sendMessage(message);
                                    //
                                    //}
                                    System.out.println("main " + diff);
                                    //
                                    event.setCancelled(true);
                                } else {
                                    cooldownMap.put(key, new Date().getTime());
                                }
                            } else if(event.getHand() == EquipmentSlot.OFF_HAND) {

                                String key = player.getUniqueId() + ":" + item.getType().name();
                                Long coolDownTime = cooldownMap.getOrDefault(key, 0L);
                                Date currentTime = new Date();
                                long diffInMillies = Math.abs(currentTime.getTime() - coolDownTime);
                                long diff = TimeUnit.SECONDS.convert(diffInMillies, TimeUnit.MILLISECONDS);
                                if (diff < 3) {
                                    String pattern = ChatColor.translateAlternateColorCodes('&', Configuration.getConfig().getString("BE_B_CDII_MSG"));
                                    MessageFormat formatter = new MessageFormat(pattern);
                                    String message = formatter.format(new Object[]{3 - diff});
                                    //if (diff != 0) {
                                    player.sendMessage(message);
                                    //
                                    //}
                                    System.out.println("OFFHAND " + diff);
                                    //
                                    event.setCancelled(true);
                                } else {
                                    cooldownMap.put(key, new Date().getTime());
                                }

                            }
                        }
                }
println был добавлен для теста
В обоих случаях main показывает?
 
два раза срабатывает именно при полёте на элитрах когда пускаю фейерверк. на блок не срабатывает
Если два раза срабатывает на одну и ту же руку - значит два раза зарегистрирован слушатель
 
Если два раза срабатывает на одну и ту же руку - значит два раза зарегистрирован слушатель
я создал отдельный плагин отвечающий только за это, и это не правильный ответ. она срабатывает два раза
 
Увидел подробности. В полёте на элитрах у этого ивента странное поведение. если фейерверк в главной руке то два клика срабатывают на основную, а если фейерверк в офф хенде, то первый клик будет второстепенный, а второй основной. Не знаю чем эта информация могла бы мне помочь в том чтобы реализовать один клик. Неужто прийдётся сувать шедуляр?
 

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

Назад
Верх