diff options
author | Pepich <benedikt.abel@yahoo.de> | 2017-02-01 11:55:02 +0100 |
---|---|---|
committer | Pepich <benedikt.abel@yahoo.de> | 2017-02-01 11:55:02 +0100 |
commit | 67a6b13f6448664f093bce88e8814d205d2480dc (patch) | |
tree | 13ef36b81fc079029e99f2664c91cceb7d0f7d80 | |
parent | a6e089ed797d9d09083099cbe448f150656ac83f (diff) |
Added support for Async commands
4 files changed, 65 insertions, 4 deletions
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<Executable> asyncExecutables = new ArrayList<Executable>();
+ /* */
+
/**
* 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<ICommandComponent> cmd, ArrayList<Integer> 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
|