Прежде всего, убедитесь, что вы дважды не зарегистрировали класс Listener, содержащий обработчик событий.
Если это не так, согласно этой теме на форумах spigot, так как Mojang добавил левый слот в Minecraft, некоторые события, такие как PlayerInteractEvent или InventoryClickEvent, будут вызваны дважды (по одному для каждой руки).
Одним из возможных исправлений является «отключение» левой руки на обработчике событий:
@EventHandler
public void onPlayerInteraction(PlayerInteractEvent event) {
if(event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getHand() == EquipmentSlot.HAND) {
//Do something once
}
}
Если вам требуется, чтобы обе руки использовались для запуска события, вы можете сделать следующее:
- При первом запуске кода вы добавляете игрока в список.
- Перед выполнением кода вы проверяете, есть ли игрок в списке. Если он находится в списке, это означает, что код был выполнен один раз, так что вы можете его пропустить.
- Запланируйте задачу по удалению игрока из списка через несколько тиков.
Код может быть следующим:
public class Foo implements Listener {
//An instance of the main plugin class
private MainClass plugin;
private List<UUID> playerBlacklist = new ArrayList<>();
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent event) {
if(playerBlacklist.contains(event.getPlayer().getUniqueId)) {
return;
} else {
blacklistPlayer(event.getPlayer());
}
//Do something
}
private void blacklistPlayer(UUID uuid) {
playerBlacklist.add(uuid);
BukkitRunnable runnable = new BukkitRunnable(){
@Override
public void run() {
playerBlacklist.remove(uuid);
}
}
runnable.runTaskLaterAsynchronously(plugin, 5L);
}
}
Дайте мне знать, если это решило вашу проблему.