尝试用了对应的监听事件设为最高级再进行event.setCancelled(true);没用、、求大佬指点
1. 删除该插件
2. 通过反射asm(应该是这个
个人觉得可以反射搞掉他的监听器内容
setCancelled并没用
仔细阅读文档可以发现
被取消的事件依然会在服务器中传递 也就是取消了它也能监听到 并作出处理
甚至被cancel的还能被cancel cancel
2. 通过反射asm(应该是这个
个人觉得可以反射搞掉他的监听器内容
setCancelled并没用
仔细阅读文档可以发现
被取消的事件依然会在服务器中传递 也就是取消了它也能监听到 并作出处理
甚至被cancel的还能被cancel cancel
二楼方式过于复杂,Bukkit已经有现成的了: HandlerList
EntityDamageByEntityEvent.getHandlerList().unregister(Plugin或Listener或RegisteredListener)
Plugin:
复制代码
Listener以及RegisteredListener:
首先Listener的类不一定可以在插件里明面上获取得到实例
因为他不一定需要赋值,声明一个变量,而是直接
复制代码
因此如果获取得到直接
复制代码
假设获取不到但知道类名,或知道插件名则:
复制代码
EntityDamageByEntityEvent.getHandlerList().unregister(Plugin或Listener或RegisteredListener)
Plugin:
- EntityDamageByEntityEvent.getHandlerList().unregister(Bukkit.getPluginManager().getPlugin("MyPlugin"));
Listener以及RegisteredListener:
首先Listener的类不一定可以在插件里明面上获取得到实例
因为他不一定需要赋值,声明一个变量,而是直接
- Bukkit.getPluginManager().registerEvents(new MyListener(),plugin);
因此如果获取得到直接
- EntityDamageByEntityEvent.getHandlerList().unregister(你获取得到的Listener);
假设获取不到但知道类名,或知道插件名则:
- List<RegisteredListener> cancelListeners=new ArrayList<>();//如果只需要取消RegisteredListener而不需要取消Listener,则使用这个
- Listener cancelListener=null;
- for(RegisteredListener registeredListener:EntityDamageByEntityEvent.getHandlerList().getRegisteredListeners())
- {
- if(registeredListener.getListener().getClass().equals(MyListener.class)) // 或者registeredListener.getPlugin().getName().equals("MyPlugin");
- {
- cancelListener=registeredListener.getListener(); //或者cancelListeners.add(registeredListener);
- break;//如果取消一整个Listener则可以break了,除非你需要取消多个Listener,那样需要做重复判断以及跟RegisteredListener一样加个List
- }
- }
- 取消Listener的方式跟plugin一样,RegisteredListener同理:
- for(RegisteredListener registeredListener:cancelListeners)
- EntityDamageByEntityEvent.getHandlerList().unregister(registeredListener);