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); } }