BrokenDust
本帖最后由 SA丶破尘 于 2022-2-7 10:46 编辑

如题:
已测试过的方法
1.将PlayerInteractEvent优先级降为Lowest
仍判断不到玩家空手右键.

结果: 插件方法无解(除坛友神仙解法),Bukkit Forge通讯可以解决
另附另一个解决办法:
runTask在玩家两个外不断设置屏障,监听右键Block事件.

3231965938
可以,分析的很到位赞同呀!!好兄弟

3231965938
感谢楼主的分享很实用也很到位,安排了铁字

3231965938
奥利给,非常感谢楼主的分享,在这里祝更多的人可以发现

吕易天
对于右键的对象为非实体(即方块或空气)时,监听PlayerInteractEvent(@EventHandler(priority=EventPriority.LOWEST,ignoreCancelled=false)),对于右键的对象为实体时,监听PlayerInteractEntityEvent(@EventHandler(priority=EventPriority.LOWEST,ignoreCancelled=false))

BrokenDust
吕易天 发表于 2022-2-5 19:20
对于右键的对象为非实体(即方块或空气)时,监听PlayerInteractEvent(@EventHandler(priority=EventPrior ...

请审题已测试过你这种方法,但仍不行.如果你说我没有写ignoreCancelled = false,也不必要写因为default就是false

吕易天
SA丶破尘 发表于 2022-2-5 19:58
请审题已测试过你这种方法,但仍不行.如果你说我没有写ignoreCancelled = false,也不必要写因为default就 ...

问题在于你没说右键的是空气、方块还是实体

BrokenDust
吕易天 发表于 2022-2-5 20:06
问题在于你没说右键的是空气、方块还是实体

抱歉,我说的是空气,实在不好意思忘记写空气了owob

吕易天
SA丶破尘 发表于 2022-2-5 19:58
请审题已测试过你这种方法,但仍不行.如果你说我没有写ignoreCancelled = false,也不必要写因为default就 ...

还有你注册监听器了吧(如果忘记注册Listener就草了)

BrokenDust
吕易天 发表于 2022-2-5 20:07
还有你注册监听器了吧(如果忘记注册Listener就草了)

并没有,刚才有大佬断了一下PlayerConnection类手里拿着东西 右键空气可以断下,但手中不拿物品断下就不行
另一种发包,他也并没有发包.所以在这里问题是无解的....

mzmzmz
此题无解
玩家空手右键空气时不会给服务器发送数据包,故无法监听
除非客户端安装特殊mod

吕易天
mzmzmz 发表于 2022-2-5 20:10
此题无解
玩家空手右键空气时不会给服务器发送数据包,故无法监听
除非客户端安装特殊mod ...

我认为有一个方法可以做到监听(很硬核那种),来一个runTaskTimer每1tick执行一次判断当前选择的快捷栏是否为空气,如果是就拿一个特殊物品替换并在它被它被单击时将其替换为空气,或者给客户端发包制造一个假物品

mzmzmz
吕易天 发表于 2022-2-5 20:20
我认为有一个方法可以做到监听(很硬核那种),来一个runTaskTimer每1tick执行一次判断当前选择的快捷栏 ...

确实可行
但没有完全可行
玩家看见自己手里无时无刻不拿着一个淡灰色染色玻璃板会很难受吧

吕易天
mzmzmz 发表于 2022-2-5 20:23
确实可行
但没有完全可行
玩家看见自己手里无时无刻不拿着一个淡灰色染色玻璃板会很难受吧 ...

忽略就好(确信),或者可以让客户端装个材质包把某个damage的钻石锄材质改成透明的(确信)

mzmzmz
吕易天 发表于 2022-2-5 20:25
忽略就好(确信),或者可以让客户端装个材质包把某个damage的钻石锄材质改成透明的(确信) ...

材质包妙解
肝败吓风

mzmzmz
吕某人妙解
我给你整理一下吧

1、制作包含特殊透明模型的材质包
2、在插件加载时给所有玩家、玩家进入时给新玩家发送材质包请求
3、(可选)通过PlayerResourcePackStatusEvent阻止玩家不使用材质包就进行游戏
4、在插件加载时、玩家切换快捷栏的数据包监听器中、玩家交互事件中,判断玩家是否空手,空手则给玩家发送设置快捷栏物品假包,内容为自定义透明材质的不可放置物品
然后PlayerInteractEvent即可正常监听

吕易天
本帖最后由 吕易天 于 2022-2-5 20:55 编辑

好,看来不是他2 3 3,他是第二个跟你说无解的2 3 3,他插件开发经验比我丰富,我在通用开发经验上比他丰富,他根据他很久以前写mztech时候反编译nms的经验得出了无解的结论,tcl(主要是除非碰到这种边缘情况,我一般不会去思考这种边缘情况的问题,只有遇到了才会去看看Mojang是怎么写的)

BrokenDust
mzmzmz 发表于 2022-2-5 20:26
材质包妙解
肝败吓风

倒是有一个办法,但是duck不必 Bukkit forge通讯,写个mod让mod处理玩家右键,传给客户端call一下自定义事件

xiaotang94
问题在于你没说右键的是空气、方块还是实体

ZX夏夜之风
不,插件解法有解。
先说明一下,我下述内容测试环境是 Spigot 1.16.5。
我记得我写的时候就是用的 PlayerInteractEvent + LOWEST
这个方法完全有效。
之前也有类似问题,也是用这个方法解决的。
若仍然不能解决,则请忽略此回答。