Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите PlayerInteractEvent вызывается два раза, однако здравствуйте..

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

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

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

    Баллы:
    123
    Версия ядра и версия API (Bukkit) - самая что не есть последняя (1.10.2),
    однако при вот таком вот коде (аля WorldEdit выбор первой и второй позиции(хотя вообще даже не важно что в коде, смысл просто в том что слушаю евент PlayerInteractEvent)):
    Код:
        @EventHandler
        public void addSelection(PlayerInteractEvent event) {
            Bukkit.broadcastMessage("TESTOVIJ TEST JOBA");
            Player player = event.getPlayer();
            UUID uuid = player.getUniqueId();
            if (GWMServerPlugin.plugin.permission.playerHasPermissions(uuid, "gwmsp.region.select")) {
                if ((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK) && event.getClickedBlock() != null && event.getItem() != null) {
                    if (event.getItem().getType() == Material.valueOf(GWMServerPlugin.plugin.config.getString("SELECT_MATERIAL"))) {
                        Block block = event.getClickedBlock();
                        Location location = block.getLocation();
                        if (!selections.containsKey(uuid)) selections.put(uuid, new Selection());
                        if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
                            selections.get(uuid).setFirst(location);
                            player.sendMessage(GWMServerPlugin.plugin.language.getText("FIRST_LOC_SELECTED_SUCCESSFUL").
                                    replace("%LOCATION%", new TextLocation(location).toString()));
                        }
                        if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
                            selections.get(uuid).setSecond(location);
                            player.sendMessage(GWMServerPlugin.plugin.language.getText("SECOND_LOC_SELECTED_SUCCESSFUL").
                                    replace("%LOCATION%", new TextLocation(location).toString()));
                        }
                    }
                }
            }
        }
    
    Я получаю вот такое в чате:
    [​IMG]
    Это вообще лечится (вызов PlayerInteractEvent 2 раза при ПКМ)?
     
    Последнее редактирование: 17 июл 2016
  2. Хостинг MineCraft
    <
  3. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Доктора в белых халатах, тут поциенту плохо, он два раза эвент кидает..
     
  4. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Потому что клиент шлёт интеракт 2 раза, по одному за каждую руку.
     
  5. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    А ты проверяй в начале эвента, не равна ли какая нибудь переменная нулю, если равна, то продолжаешь, и в конце присваивай ей 1 и таймером в 1-5 миллисекунд присваивай 0.
     
  6. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    Не совсем понял...
    "Клиент шлет интеракт 2 раза, по одному за каждую руку"...
    Но ведь я кликаю правой рукой один раз - одна рука - один раз, и всегда получаю два эвента,
    а когда кликаю левой рукой один раз - так же само одна рука, но получаю один эвент..
    Гавнокод. Лучше уж отменять эвент, а в заголовок поставить ignoreCancelled = true..
     
  7. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    2 ивента бросает не всегда, только когда в руке воздух, или не блок.
     
  8. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Так теперь 2 руки ведь. Просто игнорируй это, одна рука тупо отсеется после проверки на null, или проверки на материал.
     
  9. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    До меня медленно, но дошло..)
     
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Еще нужно проверить, на блок ли смотрит игрок, наверное.
     
  11. Автор темы
    Mr_RoboMan

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

    Баллы:
    123
    А, да, и это тоже :D
    Я сейчас по ошибке просто беру локацию игрока, хотя по задумке ведь правильно, надо брать локации блоков!
     
  12. Dymeth

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

    Баллы:
    76
    Может просто PlayerInteractEvent.getHand()?
    EquipmentSlot.HAND и
    EquipmentSlot.OFF_HAND - очень удобно, как мне кажется.
    Причём можно ещё и предметы из инвентаря получать по EquipmentSlot, если память не изменяет.
     

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