diff --git a/.factorypath b/.factorypath
new file mode 100644
index 0000000..610dea5
--- /dev/null
+++ b/.factorypath
@@ -0,0 +1,2 @@
+
+
diff --git a/.gitignore b/.gitignore
index 1917a1a..84dff78 100644
--- a/.gitignore
+++ b/.gitignore
@@ -224,3 +224,4 @@ TheButtonAutoFlair/out/artifacts/Autoflair/Autoflair.jar
*.xml
TBMC/
+/.apt_generated/
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 672496e..edf183d 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,12 +1,14 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.processAnnotations=enabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/META-INF/services/javax.annotation.processing.Processor b/META-INF/services/javax.annotation.processing.Processor
new file mode 100644
index 0000000..c52a464
--- /dev/null
+++ b/META-INF/services/javax.annotation.processing.Processor
@@ -0,0 +1 @@
+buttondevteam.lib.AnnotationProcessor
\ No newline at end of file
diff --git a/src/main/java/buttondevteam/core/CommandCaller.java b/src/main/java/buttondevteam/core/CommandCaller.java
index cb1b050..732f4ce 100644
--- a/src/main/java/buttondevteam/core/CommandCaller.java
+++ b/src/main/java/buttondevteam/core/CommandCaller.java
@@ -8,6 +8,8 @@ import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import buttondevteam.lib.TBMCCoreAPI;
+import buttondevteam.lib.chat.CommandClass;
+import buttondevteam.lib.chat.PlayerCommandBase;
import buttondevteam.lib.chat.TBMCChatAPI;
import buttondevteam.lib.chat.TBMCCommandBase;
@@ -69,11 +71,12 @@ public class CommandCaller implements CommandExecutor {
}
return true;
}
- if (cmd.GetModOnly() && !MainPlugin.permission.has(sender, "tbmc.admin")) {
+ if (cmd.getClass().getAnnotation(CommandClass.class).modOnly()
+ && !MainPlugin.permission.has(sender, "tbmc.admin")) {
sender.sendMessage("§cYou need to be a mod to use this command.");
return true;
}
- if (cmd.GetPlayerOnly() && !(sender instanceof Player)) {
+ if (cmd instanceof PlayerCommandBase && !(sender instanceof Player)) {
sender.sendMessage("§cOnly ingame players can use this command.");
return true;
}
diff --git a/src/main/java/buttondevteam/core/ScheduledRestartCommand.java b/src/main/java/buttondevteam/core/ScheduledRestartCommand.java
index 77bc185..82090d2 100644
--- a/src/main/java/buttondevteam/core/ScheduledRestartCommand.java
+++ b/src/main/java/buttondevteam/core/ScheduledRestartCommand.java
@@ -9,8 +9,10 @@ import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitTask;
import buttondevteam.lib.ScheduledServerRestartEvent;
+import buttondevteam.lib.chat.CommandClass;
import buttondevteam.lib.chat.TBMCCommandBase;
+@CommandClass(modOnly = true, path = "schrestart")
public class ScheduledRestartCommand extends TBMCCommandBase {
private static volatile int restartcounter;
private static volatile BukkitTask restarttask;
@@ -66,19 +68,4 @@ public class ScheduledRestartCommand extends TBMCCommandBase {
"You can optionally set the amount of ticks to wait before the restart." //
};
}
-
- @Override
- public boolean GetPlayerOnly() {
- return false;
- }
-
- @Override
- public boolean GetModOnly() {
- return true;
- }
-
- @Override
- public String GetCommandPath() {
- return "schrestart";
- }
}
diff --git a/src/main/java/buttondevteam/core/UpdatePluginCommand.java b/src/main/java/buttondevteam/core/UpdatePluginCommand.java
index dab077e..06f5787 100644
--- a/src/main/java/buttondevteam/core/UpdatePluginCommand.java
+++ b/src/main/java/buttondevteam/core/UpdatePluginCommand.java
@@ -4,8 +4,10 @@ import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import buttondevteam.lib.TBMCCoreAPI;
+import buttondevteam.lib.chat.CommandClass;
import buttondevteam.lib.chat.TBMCCommandBase;
+@CommandClass(modOnly = true)
public class UpdatePluginCommand extends TBMCCommandBase {
@Override
public boolean OnCommand(CommandSender sender, String alias, String[] args) {
@@ -37,14 +39,4 @@ public class UpdatePluginCommand extends TBMCCommandBase {
"To list the plugin names: /" + alias //
};
}
-
- @Override
- public boolean GetPlayerOnly() {
- return false;
- }
-
- @Override
- public boolean GetModOnly() {
- return true;
- }
}
diff --git a/src/main/java/buttondevteam/lib/AnnotationProcessor.java b/src/main/java/buttondevteam/lib/AnnotationProcessor.java
new file mode 100644
index 0000000..8e763ec
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/AnnotationProcessor.java
@@ -0,0 +1,33 @@
+package buttondevteam.lib;
+
+import java.util.List;
+import java.util.Set;
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.annotation.processing.SupportedSourceVersion;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.TypeElement;
+
+import buttondevteam.lib.player.ChromaGamerEnforcer;
+
+/** * A simple session bean type annotation processor. The implementation * is based on the standard annotation processing API in Java 6. */
+@SupportedSourceVersion(SourceVersion.RELEASE_8)
+public class AnnotationProcessor extends AbstractProcessor {
+ /** * Check if both @Stateful and @Stateless are present in an * session bean. If so, emits a warning message. */
+ @Override
+ public boolean process(Set extends TypeElement> typeElements, RoundEnvironment roundEnv) { // TODO: SEparate JAR
+ Set extends Element> elements = roundEnv.getElementsAnnotatedWith(ChromaGamerEnforcer.class);
+ for (Element element : elements) {
+ System.out.println("Processing " + element);
+ List extends AnnotationMirror> annotationMirrors = element.getAnnotationMirrors();
+ System.out.println("Annotations: " + annotationMirrors);
+ for (AnnotationMirror annotation : annotationMirrors) {
+ String type = annotation.getAnnotationType().toString();
+ System.out.println("Type: " + type);
+ }
+ }
+ return true; // claim the annotations
+ }
+}
diff --git a/src/main/java/buttondevteam/lib/chat/CommandClass.java b/src/main/java/buttondevteam/lib/chat/CommandClass.java
new file mode 100644
index 0000000..fd5ac9d
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/chat/CommandClass.java
@@ -0,0 +1,29 @@
+package buttondevteam.lib.chat;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface CommandClass {
+ /**
+ * Determines whether the command can only be used by mods and above or regular players can use it as well.
+ *
+ * @return If the command is mod only
+ */
+ public boolean modOnly();
+
+ /**
+ * The command's path, or name if top-level command.
+ * For example:
+ * "u admin updateplugin" or "u" for the top level one
+ * The path must be lowercase!
+ *
+ * @return The command path, which is the command class name by default (removing any "command" from it)
+ */
+ public String path() default "";
+}
diff --git a/src/main/java/buttondevteam/lib/chat/Format.java b/src/main/java/buttondevteam/lib/chat/Format.java
deleted file mode 100644
index b13d45b..0000000
--- a/src/main/java/buttondevteam/lib/chat/Format.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package buttondevteam.lib.chat;
-
-public enum Format implements TellrawSerializableEnum {
- Bold("bold"), Underlined("underlined"), Italic("italic"), Strikethrough("strikethrough"), Obfuscated(
- "obfuscated");
- // TODO: Add format codes to /u c
- private String name;
-
- Format(String name) {
- this.name = name;
- this.flag = 1 << this.ordinal();
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- private final int flag;
-
- public int getFlag() {
- return flag;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java b/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java
new file mode 100644
index 0000000..66a60b9
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/chat/PlayerCommandBase.java
@@ -0,0 +1,16 @@
+package buttondevteam.lib.chat;
+
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+public abstract class PlayerCommandBase extends TBMCCommandBase {
+ public abstract boolean OnCommand(Player player, String alias, String[] args);
+
+ @Override
+ public boolean OnCommand(CommandSender sender, String alias, String[] args) {
+ if (sender instanceof Player)
+ return OnCommand((Player) sender, alias, args);
+ sender.sendMessage("§cYou need to be a player to use this command.");
+ return true;
+ }
+}
diff --git a/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java b/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java
index b6317ee..0babdb8 100644
--- a/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java
+++ b/src/main/java/buttondevteam/lib/chat/TBMCChatAPI.java
@@ -61,9 +61,10 @@ public class TBMCChatAPI {
};
for (TBMCCommandBase cmd : TBMCChatAPI.GetCommands().values()) {
if (cmd.GetCommandPath().startsWith(command + " ")) {
- if (cmd.GetPlayerOnly() && !(sender instanceof Player))
+ if (cmd instanceof PlayerCommandBase && !(sender instanceof Player))
continue;
- if (cmd.GetModOnly() && !MainPlugin.permission.has(sender, "tbmc.admin"))
+ if (cmd.getClass().getAnnotation(CommandClass.class).modOnly()
+ && !MainPlugin.permission.has(sender, "tbmc.admin"))
continue;
int ind = cmd.GetCommandPath().indexOf(' ', command.length() + 2);
if (ind >= 0) {
diff --git a/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java b/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java
index 111e057..2c0cff4 100644
--- a/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java
+++ b/src/main/java/buttondevteam/lib/chat/TBMCCommandBase.java
@@ -27,24 +27,13 @@ public abstract class TBMCCommandBase {
*
* @return The command path, which is the command class name by default (removing any "command" from it)
*/
- public String GetCommandPath() {
- return getClass().getSimpleName().toLowerCase().replace("command", "");
+ public final String GetCommandPath() {
+ if (!getClass().isAnnotationPresent(CommandClass.class))
+ throw new RuntimeException("No @Command annotation on command class " + getClass().getSimpleName() + "!");
+ String path = getClass().getAnnotation(CommandClass.class).path();
+ return path.length() == 0 ? getClass().getSimpleName().toLowerCase().replace("command", "") : path;
}
- /**
- * Determines whether the command can only be used as a player, or command blocks or the console can use it as well.
- *
- * @return If the command is player only
- */
- public abstract boolean GetPlayerOnly();
-
- /**
- * Determines whether the command can only be used by mods or regular players can use it as well.
- *
- * @return If the command is mod only
- */
- public abstract boolean GetModOnly();
-
Plugin plugin; // Used By TBMCChatAPI
public final Plugin getPlugin() { // Used by CommandCaller (ButtonChat)
diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
index 944b676..d22d120 100644
--- a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
+++ b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
@@ -9,6 +9,7 @@ import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import buttondevteam.lib.TBMCCoreAPI;
+@ChromaGamerEnforcer
public abstract class ChromaGamerBase implements AutoCloseable {
public static final String TBMC_PLAYERS_DIR = "TBMC/players/";
diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java b/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java
new file mode 100644
index 0000000..35ffdf4
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/player/ChromaGamerEnforcer.java
@@ -0,0 +1,14 @@
+package buttondevteam.lib.player;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.SOURCE)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface ChromaGamerEnforcer {
+
+}