Bukkit события сработали несколько раз - PullRequest
0 голосов
/ 05 июня 2019

У меня есть этот возможно неправильный фрагмент кода:

@EventHandler
public void onPlayerInteract(PlayerInteractEvent e) {
    if (e.getAction() == Action.RIGHT_CLICK_AIR && e.getItem().getType() == Material.NAME_TAG && e.getHand() == EquipmentSlot.HAND) {
        e.getPlayer().sendMessage("right click?");
    }
}

, и каждый раз, когда я щелкаю правой кнопкой мыши по воздуху с именем тега, "правой кнопкой мыши?"сообщение отправляется игроку 5 раз при каждом пожаре.

Удаление e.getHand() == EquipmentSlot.HAND все еще повторяется 5 раз (изначально было добавлено из-за этого обсуждения / 1.9 двойного владения).Я также упомянул это , но это не имело значения.

Почему это повторяется много раз, а не 1 раз, когда произошло 1 событие?

Весь мойкод здесь .Сервер, на котором я тестирую это: 1.12.2 Spigot.

Редактировать: код для pastebin - единственный класс, используемый в проекте Java.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

onPlayerInteract вызывается до тех пор, пока событие обнаруживается, а не при первом обнаружении события.

Я узнал об этом, щелкнув правой кнопкой мыши по «нормальному» количеству времени(~ 500мс), который напечатан 5 раз.

Затем я просто удерживал нажатой правую кнопку мыши в течение ~ 1000 мс и увидел, что она печатается снова 5 раз, но сделал это дважды.Похоже, он мгновенно печатал 5, затем еще 5.

. Для моего последнего теста я решил щелкнуть правой кнопкой мыши в течение минимального количества времени, которое я мог, и, конечно же, только 1 печать сделана (я не сделал)Я не мог понять это ранее, потому что из-за небольшого размера окна чата было напечатано больше).

Я предполагал, что это все равно будет работать, печатая событие только с небольшим кодом:

@EventHandler(priority=EventPriority.HIGH)
public void onPlayerInteract(PlayerInteractEvent e) 
{
    e.getPlayer().sendMessage(e.getAction().toString());
}

Ничего подобного не произошло, и вместо этого все было напечатано один раз, за ​​исключением случая, когда блок щелкнул правой кнопкой мыши пустой рукой. Вот видео, показывающее, что я имею в виду с использованием вышеуказанного кода (каждый раз в видео чат очищается).Использование того же тела, что и выше, но вместо этого для eventRightClick(PlayerInteractEvent e) делает то же самое.

Кроме того, не показано на видео, когда удерживание левой кнопки мыши при перемещении мыши над несколькими блоками, eventRightClick вызовет несколькораз.То же самое для щелчка правой кнопкой мыши, но парами (все сделано свободной рукой).

РЕДАКТИРОВАТЬ

Удерживание правой кнопки мыши при наведении на блок пустой рукой приведет кпродолжать стрелять парами, независимо от того, наведена ли мышь на несколько блоков.Смотрите здесь .Обратите внимание, что eventRightClick делает это:

@EventHandler(priority=EventPriority.HIGH)
public void eventRightClick(PlayerInteractEvent e)
{
    e.getPlayer().sendMessage(
        e.getAction().toString() + " " + e.getEventName());
}
0 голосов
/ 05 июня 2019

Пожалуйста, подпишитесь на дополнительное событие - PlayerInteractEvent.RightClickBlock , а не на родительское событие, и проверьте, работает ли оно:

@EventHandler
public void onPlayerInteract(PlayerInteractEvent.RightClickBlock e) {

   if(e.getAction() != Action.RIGHT_CLICK_AIR ){
       return;
   }

   if(e.getItem().getType() != Material.NAME_TAG ){
       return;
   }
   e.getPlayer().sendMessage("right click?");
}

Пожалуйста, проверьте несколько регистраций.

...