From 67a6b13f6448664f093bce88e8814d205d2480dc Mon Sep 17 00:00:00 2001 From: Pepich Date: Wed, 1 Feb 2017 11:55:02 +0100 Subject: Added support for Async commands --- src/main/java/com/nemez/cmdmgr/Command.java | 11 ++++-- src/main/java/com/nemez/cmdmgr/CommandManager.java | 7 +++- .../cmdmgr/util/AsyncExecutableDefinition.java | 39 ++++++++++++++++++++++ .../java/com/nemez/cmdmgr/util/Executable.java | 12 ++++++- 4 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java diff --git a/src/main/java/com/nemez/cmdmgr/Command.java b/src/main/java/com/nemez/cmdmgr/Command.java index ff8622c..f9eaf49 100644 --- a/src/main/java/com/nemez/cmdmgr/Command.java +++ b/src/main/java/com/nemez/cmdmgr/Command.java @@ -7,7 +7,14 @@ import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) -public @interface Command { - +public @interface Command +{ + enum AsyncType + { + NEVER, ALWAYS; + } + String hook(); + + AsyncType async() default AsyncType.NEVER; } diff --git a/src/main/java/com/nemez/cmdmgr/CommandManager.java b/src/main/java/com/nemez/cmdmgr/CommandManager.java index ae788c7..79514cc 100644 --- a/src/main/java/com/nemez/cmdmgr/CommandManager.java +++ b/src/main/java/com/nemez/cmdmgr/CommandManager.java @@ -1,3 +1,4 @@ +//@noformat package com.nemez.cmdmgr; import java.io.BufferedReader; @@ -100,6 +101,10 @@ public class CommandManager { public static String noPermissionFormatting = "&c"; public static String notAllowedFormatting = "&c"; + /* List of all commands that can be invoked async */ + public static ArrayList asyncExecutables = new ArrayList(); + /* */ + /** * Registers a command from a String of source code * @@ -626,4 +631,4 @@ public class CommandManager { return data; } -} +}//@format diff --git a/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java b/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java new file mode 100644 index 0000000..7e97705 --- /dev/null +++ b/src/main/java/com/nemez/cmdmgr/util/AsyncExecutableDefinition.java @@ -0,0 +1,39 @@ +package com.nemez.cmdmgr.util; + +import java.lang.reflect.Method; +import java.util.ArrayList; + +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import com.nemez.cmdmgr.component.ICommandComponent; + +public class AsyncExecutableDefinition extends ExecutableDefinition +{ + public AsyncExecutableDefinition(ArrayList cmd, ArrayList paramLinks, String perm, + Method method, Object methodContainer, Type type) + { + super(cmd, paramLinks, perm, method, methodContainer, type); + } + + @Override + public boolean invoke(Object[] args, CommandSender sender, JavaPlugin plugin) + { + Thread t = new Thread(new Runnable() + { + @Override + public void run() + { + invokeFromThread(args, sender, plugin); + } + }); + t.setDaemon(true); + t.start(); + return true; + } + + private final void invokeFromThread(Object[] args, CommandSender sender, JavaPlugin plugin) + { + super.invoke(args, sender, plugin); + } +} diff --git a/src/main/java/com/nemez/cmdmgr/util/Executable.java b/src/main/java/com/nemez/cmdmgr/util/Executable.java index c757c9e..01c2dc4 100644 --- a/src/main/java/com/nemez/cmdmgr/util/Executable.java +++ b/src/main/java/com/nemez/cmdmgr/util/Executable.java @@ -1,3 +1,4 @@ +//@noformat package com.nemez.cmdmgr.util; import java.lang.reflect.Field; @@ -14,6 +15,7 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.Command.AsyncType; import com.nemez.cmdmgr.CommandManager; import com.nemez.cmdmgr.component.BooleanComponent; import com.nemez.cmdmgr.component.ByteComponent; @@ -263,8 +265,15 @@ public class Executable extends org.bukkit.command.Command { if (etype == null) { etype = Type.BOTH; } - ExecutableDefinition def = new ExecutableDefinition(command, links, permission, target, methodContainer, etype); + ExecutableDefinition def; + AsyncType type = target.getAnnotation(Command.class).async(); + if (type == AsyncType.ALWAYS) + def = new AsyncExecutableDefinition(command, links, permission, target, methodContainer, etype); + else + def = new ExecutableDefinition(command, links, permission, target, methodContainer, etype); commands.add(def); + if (def instanceof AsyncExecutableDefinition) + CommandManager.asyncExecutables.add(this); } @Override @@ -426,3 +435,4 @@ public class Executable extends org.bukkit.command.Command { } } } +//@format -- cgit v1.2.3