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

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

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

  1. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    Дело с фейерверками. Вроде как я обрабатываю руку и проверяю её если вначале проверяю:
    if (event.getHand() == EquipmentSlot.HAND) {
    } else if (event.getHand() == EquipmentSlot.OFF_HAND) {}
    Но почему-то на офф хенде кликается по одному разу а вот главная рука за 1 клик срабатывает 2 раза.
    Конкретно такую странность выдаёт при запуске фейерверка. Код внутри двух условий абсолютно одинаковый. Что не так?
     
  2. alexandrage

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

    Баллы:
    173
    У игрока две руки, ивент срабатывает на обе, ищите ошибку в ваших проверках на руку.
     
  3. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    как раз предоставленны. Внутри условия нету ничего что связано с руками. только элементы исчисления :good:
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Значит с ними и проблема. Без полного кода ничего не сказать тут
     
  5. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    Код:
                    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 был добавлен для теста
     
  6. OJIEKCAHDP

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

    Баллы:
    76
    Имя в Minecraft:
    OJIEKCAHDP
    Кажется он срабатывает ещё и для двух случаев: использование предмета в руке и взаимодействие с блоком.
    Когда ты тыкаешь предметом по блоку, то он два раза сработает.
     
  7. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    два раза срабатывает именно при полёте на элитрах когда пускаю фейерверк. на блок не срабатывает
     
  8. imDaniX

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

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    В обоих случаях main показывает?
     
  9. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Если два раза срабатывает на одну и ту же руку - значит два раза зарегистрирован слушатель
     
  10. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    я создал отдельный плагин отвечающий только за это, и это не правильный ответ. она срабатывает два раза
     
  11. Автор темы
    Dulcha

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

    Баллы:
    61
    Имя в Minecraft:
    iygiuyg
    Увидел подробности. В полёте на элитрах у этого ивента странное поведение. если фейерверк в главной руке то два клика срабатывают на основную, а если фейерверк в офф хенде, то первый клик будет второстепенный, а второй основной. Не знаю чем эта информация могла бы мне помочь в том чтобы реализовать один клик. Неужто прийдётся сувать шедуляр?
     

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