diff --git a/src/main/java/buttondevteam/core/PlayerListener.java b/src/main/java/buttondevteam/core/PlayerListener.java
index 0328dac..e6fd5c9 100644
--- a/src/main/java/buttondevteam/core/PlayerListener.java
+++ b/src/main/java/buttondevteam/core/PlayerListener.java
@@ -7,11 +7,10 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import buttondevteam.lib.TBMCCoreAPI;
-import buttondevteam.lib.player.TBMCPlayer;
public class PlayerListener implements Listener {
- @EventHandler(priority = EventPriority.HIGHEST)
+ /*@EventHandler(priority = EventPriority.HIGHEST)
public void OnPlayerJoin(PlayerJoinEvent event) {
TBMCPlayer player = TBMCPlayer.loadPlayer(event.getPlayer());
if (player == null) {
@@ -26,5 +25,5 @@ public class PlayerListener implements Listener {
TBMCPlayer player = TBMCPlayer.getPlayer(event.getPlayer());
TBMCPlayer.savePlayer(player);
TBMCPlayer.quitPlayer(player);
- }
+ }*/
}
diff --git a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
index e8740c1..beeaa27 100644
--- a/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
+++ b/src/main/java/buttondevteam/lib/player/ChromaGamerBase.java
@@ -41,7 +41,8 @@ public abstract class ChromaGamerBase implements AutoCloseable {
}
/**
- * This method returns the filename for this player data. For example, for Minecraft-related data, use MC UUIDs, for Discord data, use Discord IDs, etc.
+ * This method returns the filename for this player data. For example, for Minecraft-related data, use MC UUIDs, for Discord data, use Discord IDs, etc.
+ * Does not include .yml
*/
public abstract String getFileName();
diff --git a/src/main/java/buttondevteam/lib/player/PlayerClass.java b/src/main/java/buttondevteam/lib/player/PlayerClass.java
new file mode 100644
index 0000000..a543849
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/player/PlayerClass.java
@@ -0,0 +1,12 @@
+package buttondevteam.lib.player;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface PlayerClass {
+ String pluginname();
+}
diff --git a/src/main/java/buttondevteam/lib/player/TBMCPlayer.java b/src/main/java/buttondevteam/lib/player/TBMCPlayer.java
new file mode 100644
index 0000000..badbe8e
--- /dev/null
+++ b/src/main/java/buttondevteam/lib/player/TBMCPlayer.java
@@ -0,0 +1,6 @@
+package buttondevteam.lib.player;
+
+@PlayerClass(pluginname = "ButtonCore")
+public class TBMCPlayer extends TBMCPlayerBase {
+
+}
diff --git a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
index d66efc2..b6c44fa 100644
--- a/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
+++ b/src/main/java/buttondevteam/lib/player/TBMCPlayerBase.java
@@ -1,10 +1,16 @@
package buttondevteam.lib.player;
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map.Entry;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+
import com.palmergames.bukkit.towny.Towny;
import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
@@ -29,8 +35,6 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
plugindata.set("playername", value);
}
- public abstract String getPluginName();
-
@Override
public String getFileName() {
return getUUID().toString();
@@ -60,9 +64,21 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
public static T getPlayer(UUID uuid, Class cl) {
if (playermap.containsKey(uuid + "-" + cl.getSimpleName()))
return (T) playermap.get(uuid + "-" + cl.getSimpleName());
- T obj = ChromaGamerBase.getUser(uuid.toString(), cl);
- obj.uuid = uuid;
- return obj;
+ try {
+ T player;
+ if (playerfiles.containsKey(uuid)) {
+ player = cl.newInstance();
+ player.plugindata = playerfiles.get(uuid);
+ playermap.put(player.uuid + "-" + player.getFolder(), player); // It will get removed on player quit
+ } else
+ player = ChromaGamerBase.getUser(uuid.toString(), cl);
+ player.uuid = uuid;
+ return player;
+ } catch (Exception e) {
+ TBMCCoreAPI.SendException(
+ "Failed to get player with UUID " + uuid + " and class " + cl.getSimpleName() + "!", e);
+ return null;
+ }
}
/**
@@ -70,6 +86,8 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
*/
static final ConcurrentHashMap playermap = new ConcurrentHashMap<>();
+ private static final ConcurrentHashMap playerfiles = new ConcurrentHashMap<>();
+
/**
* Gets the TBMCPlayer object as a specific plugin player, keeping it's data
* Make sure to use try-with-resources with this to save the data, as it may need to load the file
@@ -84,9 +102,25 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
/**
* Only intended to use from ButtonCore
*/
- public static T loadPlayer(OfflinePlayer p, Class cl) { // TODO: Load player files and get player classes backed by the YAML
- T player = getPlayer(p.getUniqueId(), cl);
- Bukkit.getLogger().info("Loaded player: " + player.getPlayerName());
+ public static void savePlayer(TBMCPlayerBase player) {
+ Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerSaveEvent(player));
+ try {
+ player.close();
+ } catch (Exception e) {
+ new Exception("Failed to save player data for " + player.getPlayerName(), e).printStackTrace();
+ }
+ }
+
+ /**
+ * Only intended to use from ButtonCore
+ */
+ public static void joinPlayer(UUID uuid) {
+ YamlConfiguration yc;
+ if (playerfiles.containsKey(uuid))
+ yc = playerfiles.get(uuid);
+ else
+ playerfiles.put(uuid, yc = YamlConfiguration.loadConfiguration(new File("minecraft", uuid + ".yml")));
+ /*Bukkit.getLogger().info("Loaded player: " + player.getPlayerName());
if (player.getPlayerName() == null) {
player.setPlayerName(p.getName());
Bukkit.getLogger().info("Player name saved: " + player.getPlayerName());
@@ -112,40 +146,27 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
// Load in other plugins
Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerLoadEvent(player));
- return player;
+ Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerJoinEvent(player));*/
}
/**
* Only intended to use from ButtonCore
*/
- public static void savePlayer(TBMCPlayerBase player) {
- Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerSaveEvent(player));
- try {
- player.close();
- } catch (Exception e) {
- new Exception("Failed to save player data for " + player.getPlayerName(), e).printStackTrace();
+ public static void quitPlayer(Player p) {
+ Iterator> it = playermap.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry entry = it.next();
+ if (entry.getKey().startsWith(p.getUniqueId().toString())) { // Save every player data
+ TBMCPlayerBase player = entry.getValue(); // TODO: Separate plugin data by plugin name (annotations?)
+ Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerQuitEvent(player));
+ }
}
- }
-
- /**
- * Only intended to use from ButtonCore
- */
- public static void joinPlayer(TBMCPlayerBase player) {
- playermap.put(player.uuid + "-" + player.getFolder(), player);
- Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerJoinEvent(player));
- }
-
- /**
- * Only intended to use from ButtonCore
- */
- public static void quitPlayer(TBMCPlayerBase player) {
- Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerQuitEvent(player));
- playermap.remove(player.uuid + "-" + player.getFolder());
- try {
- player.close();
+ final YamlConfiguration playerfile = playerfiles.get(p.getUniqueId());
+ try { // Only save to file once, not for each plugin
+ playerfile.save(p.getUniqueId().toString() + ".yml"); // TODO: Bring this together with the close() method, like a common method or something
} catch (Exception e) {
- TBMCCoreAPI.SendException("Error while saving quitting player " + player.getPlayerName() + " ("
- + player.getFolder() + "/" + player.getFileName() + ")!", e);
+ TBMCCoreAPI.SendException("Error while saving quitting player " + playerfile.getString("playername") + " ("
+ + "minecraft/" + p.getUniqueId() + ".yml)!", e);
}
}