💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[danger] 这个自定义类放在 `plugins\PxRpg\Modules\Code\Cover` 里面 并且需要在 `plugins\PxRpg\Modules\Code\env-imports.yml` 进行导入 使用此工具类需要 [PxTools1.12.2+](../../PxTools/%E4%BB%8B%E7%BB%8D.md) <br> <br> <br> 在`plugins\PxRpg\Modules\Monitor\Monitor.yml`文件的内容改成: 其作用是在 插件卸载时,卸载所有监听器, 和插件载入时, 调用 onEnable() 方法 ``` onEnable: |- EventAPI.onEnable(); onDisable: |- EventAPI.onDisable(); ``` <br> <br> <br> # 完整文件 > 文件名: `pxrpg.util.event.EventAPI.java` ``` import com.pxpmc.pxrpg.bukkit.PxRpg; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.*; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.EventExecutor; import java.util.HashMap; import java.util.Map; class EventAPI { static boolean debug; static Map map; static { debug = true; map = new HashMap(); } /** * 载入方法,可以在 `Monitor.yml` 的 onEnable 方法调用 */ static void onEnable() { //这只是例子,可以删除 //这个类导入pxrpg后可以在pr的任何地方调用,但是不要重复调用相同功能的监听器,每调用一次就会监听一次,多次调用后会多次触发监听回调 hookEvent("监听玩家上线的功能", PlayerJoinEvent.class, new EventExecutor() { public void execute(Listener listener, Event event) { PlayerJoinEvent e = (PlayerJoinEvent) event; Player player = e.getPlayer(); System.out.println("监听器监听到了玩家上线: " + player.getName()); } }); //这只是例子,可以删除 hookEvent("监听玩家下线的功能", PlayerQuitEvent.class, new EventExecutor() { public void execute(Listener listener, Event event) { PlayerQuitEvent e = (PlayerQuitEvent) event; Player player = e.getPlayer(); System.out.println("监听器监听到了玩家下线: " + player.getName()); } }); } /** * 监听事件 * * @param type 用作标记字串,以防重复监听相同功能 * @param clazz 事件类型 * @param eventExecutor 事件执行器 */ static void hookEvent(String type, Class clazz, EventExecutor eventExecutor) { Listener remove = map.remove(type); //注册前判断是否重复 if (remove != null) { HandlerList.unregisterAll(remove); if (debug) System.out.println("清除了标记为 " + type + " 的监听,以免重复监听"); } Listener listener = new Listener() { }; Bukkit.getPluginManager().registerEvent(clazz, listener, EventPriority.HIGH, eventExecutor, PxRpg.getInstance()); if (debug) System.out.println("成功监听了 " + clazz.getSimpleName() + " 事件,标记为: " + type); map.put(type, listener); } /** * 卸载方法,需要在 `Monitor.yml` 的 onDisable 方法调用 */ static void onDisable() { for (Listener listener : map.values()) HandlerList.unregisterAll(listener); map.clear(); if (debug) System.out.println("清空所有监听器"); } } ```