diff --git a/pom.xml b/pom.xml
index b855faa..8609c02 100644
--- a/pom.xml
+++ b/pom.xml
@@ -138,6 +138,11 @@
javassist3.20.0-GA
+
+ org.mockito
+ mockito-core
+ 2.7.20
+ TBMCPlugins
diff --git a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java
index 62c0e37..469095e 100644
--- a/src/main/java/buttondevteam/lib/TBMCCoreAPI.java
+++ b/src/main/java/buttondevteam/lib/TBMCCoreAPI.java
@@ -21,7 +21,7 @@ import buttondevteam.core.MainPlugin;
import buttondevteam.lib.player.ChromaGamerBase;
import buttondevteam.lib.potato.DebugPotato;
-public final class TBMCCoreAPI {
+public class TBMCCoreAPI {
static List coders = new ArrayList() {
private static final long serialVersionUID = -4462159250738367334L;
{
diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
index aa64747..1282ddb 100644
--- a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
+++ b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
@@ -46,7 +46,7 @@ public abstract class ChromaGamerBase implements AutoCloseable {
public abstract String getFileName();
/**
- * The 'id' must be always set
+ * Use {@link #data()} or {@link #data(String)} where possible; the 'id' must be always set
*/
protected YamlConfiguration plugindata;
@@ -177,7 +177,7 @@ public abstract class ChromaGamerBase implements AutoCloseable {
protected PlayerData data(String sectionname) {
if (!getClass().isAnnotationPresent(UserClass.class))
throw new RuntimeException("Class not registered as a user class! Use @UserClass");
- String mname = sectionname + "." + new Exception().getStackTrace()[1].getMethodName();
+ String mname = sectionname + "." + new Exception().getStackTrace()[2].getMethodName();
if (!datamap.containsKey(mname))
datamap.put(mname, new PlayerData(mname, plugindata));
return datamap.get(mname);
@@ -192,12 +192,45 @@ public abstract class ChromaGamerBase implements AutoCloseable {
protected PlayerData data() {
if (!getClass().isAnnotationPresent(UserClass.class))
throw new RuntimeException("Class not registered as a user class! Use @UserClass");
- String mname = new Exception().getStackTrace()[2].getMethodName();
+ String mname = new Exception().getStackTrace()[1].getMethodName();
if (!datamap.containsKey(mname))
datamap.put(mname, new PlayerData(mname, plugindata));
return datamap.get(mname);
}
+ @SuppressWarnings("rawtypes")
+ private HashMap dataenummap = new HashMap<>();
+
+ /**
+ * Use from a data() method, which is in a method with the name of the key. For example, use flair() for the enclosing method of the outer data() to save to and load from "flair"
+ *
+ * @return A data object with methods to get and set
+ */
+ @SuppressWarnings("unchecked")
+ protected > EnumPlayerData dataEnum(String sectionname, Class cl) {
+ if (!getClass().isAnnotationPresent(UserClass.class))
+ throw new RuntimeException("Class not registered as a user class! Use @UserClass");
+ String mname = sectionname + "." + new Exception().getStackTrace()[2].getMethodName();
+ if (!dataenummap.containsKey(mname))
+ dataenummap.put(mname, new EnumPlayerData(mname, plugindata, cl));
+ return dataenummap.get(mname);
+ }
+
+ /**
+ * Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair"
+ *
+ * @return A data object with methods to get and set
+ */
+ @SuppressWarnings("unchecked")
+ protected > EnumPlayerData dataEnum(Class cl) {
+ if (!getClass().isAnnotationPresent(UserClass.class))
+ throw new RuntimeException("Class not registered as a user class! Use @UserClass");
+ String mname = new Exception().getStackTrace()[1].getMethodName();
+ if (!dataenummap.containsKey(mname))
+ dataenummap.put(mname, new EnumPlayerData(mname, plugindata, cl));
+ return dataenummap.get(mname);
+ }
+
/**
* Get player information. This method calls the {@link TBMCPlayerGetInfoEvent} to get all the player information across the TBMC plugins.
*
diff --git a/src/main/java/buttondevteam/lib/player/EnumPlayerData.java b/src/main/java/buttondevteam/lib/player/EnumPlayerData.java
new file mode 100644
index 0000000..586e845
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/player/EnumPlayerData.java
@@ -0,0 +1,21 @@
+package buttondevteam.lib.player;
+
+import org.bukkit.configuration.file.YamlConfiguration;
+
+public class EnumPlayerData> {
+ private PlayerData data;
+ private Class cl;
+
+ public EnumPlayerData(String name, YamlConfiguration yaml, Class cl) {
+ data = new PlayerData(name, yaml);
+ this.cl = cl;
+ }
+
+ public T get() {
+ return Enum.valueOf(cl, data.get());
+ }
+
+ public void set(T value) {
+ data.set(value.toString());
+ }
+}
diff --git a/src/main/java/buttondevteam/lib/player/PlayerData.java b/src/main/java/buttondevteam/lib/player/PlayerData.java
index f729907..fb5326b 100644
--- a/src/main/java/buttondevteam/lib/player/PlayerData.java
+++ b/src/main/java/buttondevteam/lib/player/PlayerData.java
@@ -16,7 +16,7 @@ public class PlayerData {
return (T) yaml.get(name);
}
- public void set(String value) {
+ public void set(T value) {
yaml.set(name, value);
}
}
diff --git a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
index 87382a5..3a174c5 100644
--- a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
+++ b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
@@ -26,7 +26,8 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
protected TBMCPlayerBase() {
if (getClass().isAnnotationPresent(PlayerClass.class))
pluginname = getClass().getAnnotation(PlayerClass.class).pluginname();
- throw new RuntimeException("Class not defined as player class! Use @PlayerClass");
+ else
+ throw new RuntimeException("Class not defined as player class! Use @PlayerClass");
}
public UUID getUUID() {
@@ -42,7 +43,6 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
return getUUID().toString();
}
-
/**
* Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair"
*
@@ -52,6 +52,15 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
return super.data(pluginname);
}
+ /**
+ * Use from a method with the name of the key. For example, use flair() for the enclosing method to save to and load from "flair"
+ *
+ * @return A data object with methods to get and set
+ */
+ protected > EnumPlayerData dataEnum(Class cl) {
+ return super.dataEnum(pluginname, cl);
+ }
+
/**
* Get player as a plugin player
*
diff --git a/src/main/java/buttondevteam/lib/player/UserClass.java b/src/main/java/buttondevteam/lib/player/UserClass.java
index 2f389ac..bbe9b59 100644
--- a/src/main/java/buttondevteam/lib/player/UserClass.java
+++ b/src/main/java/buttondevteam/lib/player/UserClass.java
@@ -1,6 +1,7 @@
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;
@@ -13,6 +14,7 @@ import java.lang.annotation.Target;
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
+@Inherited
public @interface UserClass {
/**
* Indicates which folder should the player files be saved in.
diff --git a/src/test/java/buttondevteam/core/PlayerDataTest.java b/src/test/java/buttondevteam/core/PlayerDataTest.java
new file mode 100644
index 0000000..4abde02
--- /dev/null
+++ b/src/test/java/buttondevteam/core/PlayerDataTest.java
@@ -0,0 +1,63 @@
+package buttondevteam.core;
+
+import java.util.UUID;
+import java.util.logging.Logger;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Server;
+import org.bukkit.plugin.PluginManager;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import buttondevteam.core.TestPlayerClass.TestEnum;
+import buttondevteam.lib.player.TBMCPlayerBase;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+public class PlayerDataTest extends TestCase {
+ public PlayerDataTest() {
+ super("Player data test");
+ }
+
+ /**
+ * @return the suite of tests being tested
+ */
+ public static Test suite() {
+ return new TestSuite(PlayerDataTest.class);
+ }
+
+ public void testConfig() {
+ Bukkit.setServer(Mockito.mock(Server.class, new Answer