diff --git a/pom.xml b/pom.xml index 4168dee..c21fec5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 pw.yumc Yum - 2.5 + 2.5.1 Yum Minecraft 服务器插件管理系统 @@ -60,6 +60,7 @@ &a全新 2.X 版本 更多守护与优化 + &b2.5.1 &6- &b添加能耗监控系统(Bate)...; &b2.5 &6- &d修复主线程守护系统错误...; &b2.4 &6- &c修复重载插件导致线程安全错误的问题...; &b2.3 &6- &a网络监控添加域名白名单功能...; diff --git a/src/main/java/pw/yumc/Yum/Yum.java b/src/main/java/pw/yumc/Yum/Yum.java index 4db0a6b..f7f4d26 100644 --- a/src/main/java/pw/yumc/Yum/Yum.java +++ b/src/main/java/pw/yumc/Yum/Yum.java @@ -8,7 +8,6 @@ import java.util.TimerTask; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import cn.citycraft.CommonData.UpdatePlugin; @@ -19,6 +18,7 @@ import pw.yumc.Yum.commands.FileCommand; import pw.yumc.Yum.commands.MonitorCommand; import pw.yumc.Yum.commands.NetCommand; import pw.yumc.Yum.commands.YumCommand; +import pw.yumc.Yum.listeners.PluginListener; import pw.yumc.Yum.listeners.PluginNetworkListener; import pw.yumc.Yum.listeners.SecurityListener; import pw.yumc.Yum.listeners.ThreadSafetyListener; @@ -45,9 +45,9 @@ public class Yum extends JavaPlugin { @Override public void onDisable() { NetworkManager.unregister(); - for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) { - YumAPI.uninject(plugin); - } + // for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) { + // YumAPI.uninject(plugin); + // } } @Override @@ -59,7 +59,6 @@ public class Yum extends JavaPlugin { initCommands(); initListeners(); initRunnable(); - initInject(); new VersionChecker(this); YumAPI.updaterepo(Bukkit.getConsoleSender()); YumAPI.updatecheck(Bukkit.getConsoleSender()); @@ -85,17 +84,11 @@ public class Yum extends JavaPlugin { new MonitorCommand(this); } - private void initInject() { - for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) { - YumAPI.inject(plugin); - } - PluginKit.scp("§a性能监控系统已启用..."); - } - /** * 初始化监听 */ private void initListeners() { + new PluginListener(); if (ConfigManager.i().isSetOpEnable()) { try { final ClassLoader cl = Class.forName("pw.yumc.injected.event.SetOpEvent").getClassLoader(); @@ -126,7 +119,7 @@ public class Yum extends JavaPlugin { private void initRunnable() { // 需要在主线程注册任务 if (ConfigManager.i().isMainThreadCheck() && mainThread != null) { - PluginKit.scp("§aIO管理系统已启用..."); + PluginKit.scp("§aI O 管理系统已启用..."); if (tt != null) { tt.cancel(); } diff --git a/src/main/java/pw/yumc/Yum/api/YumAPI.java b/src/main/java/pw/yumc/Yum/api/YumAPI.java index b6a46a5..3e0f088 100644 --- a/src/main/java/pw/yumc/Yum/api/YumAPI.java +++ b/src/main/java/pw/yumc/Yum/api/YumAPI.java @@ -13,6 +13,7 @@ import org.bukkit.plugin.Plugin; import cn.citycraft.CommonData.UpdatePlugin; import cn.citycraft.PluginHelper.kit.PKit; import pw.yumc.Yum.inject.CommandInjector; +import pw.yumc.Yum.inject.TaskInjector; import pw.yumc.Yum.managers.ConfigManager; import pw.yumc.Yum.managers.DownloadManager; import pw.yumc.Yum.managers.PluginsManager; @@ -105,7 +106,7 @@ public class YumAPI { public static void inject(final Plugin plugin) { CommandInjector.inject(plugin); // ListenerInjector.inject(plugin); - // TaskInjector.inject(plugin); + TaskInjector.inject(plugin); } /** @@ -211,7 +212,7 @@ public class YumAPI { public static void uninject(final Plugin plugin) { CommandInjector.uninject(plugin); // ListenerInjector.uninject(plugin); - // TaskInjector.uninject(plugin); + TaskInjector.uninject(plugin); } /** diff --git a/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java b/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java index c7f3931..05dfa77 100644 --- a/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java +++ b/src/main/java/pw/yumc/Yum/commands/MonitorCommand.java @@ -11,9 +11,11 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.command.SimpleCommandMap; -import org.bukkit.command.TabCompleter; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.RegisteredListener; import org.bukkit.scheduler.BukkitTask; import cn.citycraft.PluginHelper.commands.HandlerCommand; @@ -23,6 +25,7 @@ import cn.citycraft.PluginHelper.commands.InvokeSubCommand; import cn.citycraft.PluginHelper.ext.kit.Reflect; import pw.yumc.Yum.Yum; import pw.yumc.Yum.inject.CommandInjector; +import pw.yumc.Yum.inject.ListenerInjector; import pw.yumc.Yum.inject.TaskInjector; /** @@ -79,11 +82,33 @@ public class MonitorCommand implements HandlerCommands { str.append(String.format("§6平均耗时: §d%.2f秒!", injected.totalTime / 1000000.0 / injected.count)); } e.getSender().sendMessage(str.toString()); - } else { - final TabCompleter completer = Reflect.on(command).get("completer"); - final CommandInjector commandInjector = new CommandInjector(executor, completer); - Reflect.on(command).set("executor", commandInjector); - Reflect.on(command).set("completer", commandInjector); + } + } + } + + @HandlerCommand(name = "event", minimumArguments = 1, possibleArguments = "插件名称") + public void event(final InvokeCommandEvent e) { + final String pname = e.getArgs()[0]; + final CommandSender sender = e.getSender(); + final Plugin plugin = Bukkit.getPluginManager().getPlugin(pname); + if (plugin == null) { + sender.sendMessage("§c插件不存在!"); + return; + } + sender.sendMessage("§6插件 §b" + pname + " §6的事件能耗如下!"); + final List listeners = HandlerList.getRegisteredListeners(plugin); + for (final RegisteredListener listener : listeners) { + final EventExecutor executor = Reflect.on(listener).get("executor"); + if (executor instanceof ListenerInjector) { + final ListenerInjector injected = (ListenerInjector) executor; + final StringBuffer str = new StringBuffer(); + str.append("§6- §e" + injected.getOriginalExecutor().getClass().getSimpleName() + " "); + str.append(String.format("§6总耗时: §a%.2f秒 ", injected.totalTime / 1000000.0)); + str.append("§6执行次数: §b" + injected.count + "次 "); + if (injected.count != 0) { + str.append(String.format("§6平均耗时: §d%.2f秒!", injected.totalTime / 1000000.0 / injected.count)); + } + e.getSender().sendMessage(str.toString()); } } } @@ -104,16 +129,13 @@ public class MonitorCommand implements HandlerCommands { if (task instanceof TaskInjector) { final TaskInjector executor = (TaskInjector) task; final StringBuffer str = new StringBuffer(); - str.append("§6- §e" + task.getClass().getSimpleName() + " "); + str.append("§6- §e" + executor.getOriginalTask().getClass().getSimpleName() + " "); str.append(String.format("§6总耗时: §a%.2f秒 ", executor.totalTime / 1000000.0)); str.append("§6执行次数: §b" + executor.count + "次 "); if (executor.count != 0) { str.append(String.format("§6平均耗时: §d%.2f秒!", executor.totalTime / 1000000.0 / executor.count)); } e.getSender().sendMessage(str.toString()); - } else { - final TaskInjector taskInjector = new TaskInjector(task); - Reflect.on(pendingTask).set("task", taskInjector); } } } diff --git a/src/main/java/pw/yumc/Yum/inject/CommandInjector.java b/src/main/java/pw/yumc/Yum/inject/CommandInjector.java index 0db2ea8..1110b5c 100644 --- a/src/main/java/pw/yumc/Yum/inject/CommandInjector.java +++ b/src/main/java/pw/yumc/Yum/inject/CommandInjector.java @@ -14,7 +14,6 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import cn.citycraft.PluginHelper.ext.kit.Reflect; -import cn.citycraft.PluginHelper.kit.PluginKit; public class CommandInjector implements TabExecutor { @@ -48,7 +47,6 @@ public class CommandInjector implements TabExecutor { } } } - PluginKit.scp("§a注入命令性能监控到 " + toInjectPlugin.getName()); } public static void uninject(final Plugin toUninject) { diff --git a/src/main/java/pw/yumc/Yum/inject/ListenerInjector.java b/src/main/java/pw/yumc/Yum/inject/ListenerInjector.java index 98c6103..8891e07 100644 --- a/src/main/java/pw/yumc/Yum/inject/ListenerInjector.java +++ b/src/main/java/pw/yumc/Yum/inject/ListenerInjector.java @@ -35,8 +35,10 @@ public class ListenerInjector implements EventExecutor { public static void uninject(final Plugin plugin) { final List listeners = HandlerList.getRegisteredListeners(plugin); for (final RegisteredListener listener : listeners) { - final ListenerInjector executor = Reflect.on(listener).get("executor"); - Reflect.on(listener).set("executor", executor.getOriginalExecutor()); + final EventExecutor executor = Reflect.on(listener).get("executor"); + if (executor instanceof ListenerInjector) { + Reflect.on(listener).set("executor", ((ListenerInjector) executor).getOriginalExecutor()); + } } } diff --git a/src/main/java/pw/yumc/Yum/inject/TaskInjector.java b/src/main/java/pw/yumc/Yum/inject/TaskInjector.java index cdab525..796e14e 100644 --- a/src/main/java/pw/yumc/Yum/inject/TaskInjector.java +++ b/src/main/java/pw/yumc/Yum/inject/TaskInjector.java @@ -41,8 +41,10 @@ public class TaskInjector implements Runnable { for (final BukkitTask pendingTask : pendingTasks) { // we could ignore async tasks for now if (pendingTask.isSync() && pendingTask.getOwner().equals(plugin)) { - final TaskInjector originalTask = Reflect.on(pendingTask).get("task"); - Reflect.on(pendingTask).set("task", originalTask.getOriginalTask()); + final Runnable originalTask = Reflect.on(pendingTask).get("task"); + if (originalTask instanceof TaskInjector) { + Reflect.on(pendingTask).set("task", ((TaskInjector) originalTask).getOriginalTask()); + } } } } diff --git a/src/main/java/pw/yumc/Yum/listeners/PluginListener.java b/src/main/java/pw/yumc/Yum/listeners/PluginListener.java index 7474521..ffceebf 100644 --- a/src/main/java/pw/yumc/Yum/listeners/PluginListener.java +++ b/src/main/java/pw/yumc/Yum/listeners/PluginListener.java @@ -7,6 +7,7 @@ import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.event.server.PluginEnableEvent; import cn.citycraft.PluginHelper.kit.PKit; +import cn.citycraft.PluginHelper.kit.PluginKit; import pw.yumc.Yum.api.YumAPI; /** @@ -18,6 +19,7 @@ public class PluginListener implements Listener { public PluginListener() { Bukkit.getPluginManager().registerEvents(this, PKit.i()); + PluginKit.scp("§a性能监控系统已启用..."); } @EventHandler