Added some code and some TODOs

This commit is contained in:
Norbi Peti 2017-01-27 22:54:24 +01:00
parent 5e4128afe7
commit 5f62df97de
5 changed files with 78 additions and 39 deletions

View file

@ -7,11 +7,10 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import buttondevteam.lib.TBMCCoreAPI; import buttondevteam.lib.TBMCCoreAPI;
import buttondevteam.lib.player.TBMCPlayer;
public class PlayerListener implements Listener { public class PlayerListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) /*@EventHandler(priority = EventPriority.HIGHEST)
public void OnPlayerJoin(PlayerJoinEvent event) { public void OnPlayerJoin(PlayerJoinEvent event) {
TBMCPlayer player = TBMCPlayer.loadPlayer(event.getPlayer()); TBMCPlayer player = TBMCPlayer.loadPlayer(event.getPlayer());
if (player == null) { if (player == null) {
@ -26,5 +25,5 @@ public class PlayerListener implements Listener {
TBMCPlayer player = TBMCPlayer.getPlayer(event.getPlayer()); TBMCPlayer player = TBMCPlayer.getPlayer(event.getPlayer());
TBMCPlayer.savePlayer(player); TBMCPlayer.savePlayer(player);
TBMCPlayer.quitPlayer(player); TBMCPlayer.quitPlayer(player);
} }*/
} }

View file

@ -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.<br>
* <b>Does not include .yml</b>
*/ */
public abstract String getFileName(); public abstract String getFileName();

View file

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

View file

@ -0,0 +1,6 @@
package buttondevteam.lib.player;
@PlayerClass(pluginname = "ButtonCore")
public class TBMCPlayer extends TBMCPlayerBase {
}

View file

@ -1,10 +1,16 @@
package buttondevteam.lib.player; package buttondevteam.lib.player;
import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer; 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.Towny;
import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException; import com.palmergames.bukkit.towny.exceptions.AlreadyRegisteredException;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
@ -29,8 +35,6 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
plugindata.set("playername", value); plugindata.set("playername", value);
} }
public abstract String getPluginName();
@Override @Override
public String getFileName() { public String getFileName() {
return getUUID().toString(); return getUUID().toString();
@ -60,9 +64,21 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
public static <T extends TBMCPlayerBase> T getPlayer(UUID uuid, Class<T> cl) { public static <T extends TBMCPlayerBase> T getPlayer(UUID uuid, Class<T> cl) {
if (playermap.containsKey(uuid + "-" + cl.getSimpleName())) if (playermap.containsKey(uuid + "-" + cl.getSimpleName()))
return (T) playermap.get(uuid + "-" + cl.getSimpleName()); return (T) playermap.get(uuid + "-" + cl.getSimpleName());
T obj = ChromaGamerBase.getUser(uuid.toString(), cl); try {
obj.uuid = uuid; T player;
return obj; 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<String, TBMCPlayerBase> playermap = new ConcurrentHashMap<>(); static final ConcurrentHashMap<String, TBMCPlayerBase> playermap = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<UUID, YamlConfiguration> playerfiles = new ConcurrentHashMap<>();
/** /**
* Gets the TBMCPlayer object as a specific plugin player, keeping it's data<br> * Gets the TBMCPlayer object as a specific plugin player, keeping it's data<br>
* Make sure to use try-with-resources with this to save the data, as it may need to load the file * 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 * Only intended to use from ButtonCore
*/ */
public static <T extends TBMCPlayerBase> T loadPlayer(OfflinePlayer p, Class<T> cl) { // TODO: Load player files and get player classes backed by the YAML public static void savePlayer(TBMCPlayerBase player) {
T player = getPlayer(p.getUniqueId(), cl); Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerSaveEvent(player));
Bukkit.getLogger().info("Loaded player: " + player.getPlayerName()); 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) { if (player.getPlayerName() == null) {
player.setPlayerName(p.getName()); player.setPlayerName(p.getName());
Bukkit.getLogger().info("Player name saved: " + player.getPlayerName()); Bukkit.getLogger().info("Player name saved: " + player.getPlayerName());
@ -112,40 +146,27 @@ public abstract class TBMCPlayerBase extends ChromaGamerBase {
// Load in other plugins // Load in other plugins
Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerLoadEvent(player)); Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerLoadEvent(player));
return player; Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerJoinEvent(player));*/
} }
/** /**
* Only intended to use from ButtonCore * Only intended to use from ButtonCore
*/ */
public static void savePlayer(TBMCPlayerBase player) { public static void quitPlayer(Player p) {
Bukkit.getServer().getPluginManager().callEvent(new TBMCPlayerSaveEvent(player)); Iterator<Entry<String, TBMCPlayerBase>> it = playermap.entrySet().iterator();
try { while (it.hasNext()) {
player.close(); Entry<String, TBMCPlayerBase> entry = it.next();
} catch (Exception e) { if (entry.getKey().startsWith(p.getUniqueId().toString())) { // Save every player data
new Exception("Failed to save player data for " + player.getPlayerName(), e).printStackTrace(); TBMCPlayerBase player = entry.getValue(); // TODO: Separate plugin data by plugin name (annotations?)
}
}
/**
* 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)); 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) { } catch (Exception e) {
TBMCCoreAPI.SendException("Error while saving quitting player " + player.getPlayerName() + " (" TBMCCoreAPI.SendException("Error while saving quitting player " + playerfile.getString("playername") + " ("
+ player.getFolder() + "/" + player.getFileName() + ")!", e); + "minecraft/" + p.getUniqueId() + ".yml)!", e);
} }
} }