java - Bukkit 事件多次触发

标签 java minecraft bukkit

我有这个可能有错误的代码片段:

@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次(最初是因为this讨论/1.9双持而添加的)。我还提到了this ,但这并没有什么区别。

为什么在发生 1 个事件时会重复多次而不是 1 次?

我的整个代码是here 。我正在测试的服务器是 1.12.2 Spigot。

编辑: Pastebin 的代码是 Java 项目中使用的唯一类。

最佳答案

onPlayerInteract 只要检测到事件就会调用,而不是在第一次检测到事件时调用。

我通过右键单击“正常”时间(约 500 毫秒)发现了这一点,打印了 5 次。

然后我一直按住右键约 1000 毫秒,然后看到它再次打印了 5 次,但还是打印了两次。它似乎立即打印出 5,然后又打印出另一个 5。

对于我的最后一个测试,我决定右键单击尽可能短的时间,果然,只完成了 1 次打印(我之前没有意识到,由于聊天框很小,所以打印了更多次)尺寸)。

我认为通过仅使用小代码打印事件,这仍然可以正常工作:

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

没有发生类似的情况,相反,所有内容都被打印一次,除非空手右键单击一个 block 。 Here's该视频描述了我使用上述代码的含义(视频中每隔一段时间,聊天就会被清除)。使用上面相同的主体,但使用 eventRightClick(PlayerInteractEvent e) 可以实现相同的效果。

此外,视频中未显示,当按住左键单击并将鼠标移动到多个 block 上时,eventRightClick 将触发多次。右键单击相同,但成对进行(全部都是徒手完成的)。

编辑

空手瞄准一个方 block 时按住右键将继续成对开火,无论鼠标是否瞄准多个方 block 。请参阅here 。请注意,eventRightClick 执行以下操作:

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

关于java - Bukkit 事件多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56453462/

相关文章:

javascript - 获取 Minecraft 图像

java - 如何改变活塞方向?

java - 将 Class[] 转换为泛型?

java - Minecraft 插件 WorldEdit 获取区域

regex - 如果模式匹配,则从 lua 表中打印值

java - Minecraft - 漂浮元素消失了这个代码?

java - 布基特。聊天中支持颜色 (&) ?和用户名 onplayerjoin 不起作用?

java - JFXtras 类及其对象解释

java - 翻译功能出了什么问题?

java - 使用ANTLR对Java源文件进行静态分析