就是如果一个插件写了很多同一个事件的监听,想注销其中一个监听器,保留其他监听器的监听(都是监听同一个事件但是监听的内容不一样),如果要实现这种功能该怎么写?就是用命令作为开关,实现某个监听器的注册与注销
定义一个hashMap,存所有的开启和关闭状态,监听事件首行判断一下true false就好了。 执行指令的时候修改map中的值
本帖最后由 白色的小熊 于 2022-8-12 19:42 编辑
定义之后,首次触发事件的时候会冒出复制代码就是刚刚reload完之后,发一条消息触发事件之后会出现这个错误,后面就没有这个错误了,请问是怎么回事?
暗淡¡ 发表于 2022-8-12 18:16
定义一个hashMap,存所有的开启和关闭状态,监听事件首行判断一下true false就好了。 执行指令的时候修改ma ...
定义之后,首次触发事件的时候会冒出
- [Async Chat Thread - #14/ERROR]: Could not pass event AsyncPlayerChatEvent to test v1.0
- org.bukkit.event.EventException: null
- at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
- at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
- at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:589) [spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
- at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:576) [spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
- at net.minecraft.server.network.PlayerConnection.chat(PlayerConnection.java:1879) [spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
- at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1813) [spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
- at net.minecraft.server.network.PlayerConnection.a(PlayerConnection.java:1779) [spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
- at net.minecraft.network.protocol.game.PacketPlayInChat$1.run(PacketPlayInChat.java:40) [spigot-1.18.2-R0.1-SNAPSHOT.jar:3498-Spigot-b081915-10ba1be]
- at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) [?:?]
- at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
- at java.lang.Thread.run(Thread.java:833) [?:?]
- Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Boolean.booleanValue()" because the return value of "java.util.HashMap.get(Object)" is null
- at MyPlugin.Listener.onPlayerChat(Listener.java:25) ~[?:?]
- at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
- at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
- at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
- at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
- at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-api-1.18.2-R0.1-SNAPSHOT.jar:?]
- ... 12 more
白色的小熊 发表于 2022-8-12 18:22
**** 作者被禁止或删除 内容自动屏蔽 ****
字面意思,你没有对onPlayerChat中HashMap::get(Object)方法的返回值判空就拆箱
本帖最后由 追求简单的人 于 2022-8-13 00:32 编辑
首先,保存你的这个事件的监听器对象
然后用Event类的这个方法
@NotNull
public abstract HandlerList getHandlers()
来获得此事件所有已注册的所有监听器对象组成的一个列表对象
最后通过列表对象调用HandlerList类的这个方法
public void unregister(@NotNull
Listener listener)即可注销单个监听器对象
首先,保存你的这个事件的监听器对象
然后用Event类的这个方法
@NotNull
public abstract HandlerList getHandlers()
来获得此事件所有已注册的所有监听器对象组成的一个列表对象
最后通过列表对象调用HandlerList类的这个方法
public void unregister(@NotNull
Listener listener)即可注销单个监听器对象
试试在你的事件函数里(优先级设高点?)使用getHanlderList().unregister()