diff --git a/src/main/java/de/iani/treasurechest/PriceChestCommandExecutor.java b/src/main/java/de/iani/treasurechest/PriceChestCommandExecutor.java deleted file mode 100644 index 5e55480..0000000 --- a/src/main/java/de/iani/treasurechest/PriceChestCommandExecutor.java +++ /dev/null @@ -1,261 +0,0 @@ -package de.iani.treasurechest; - -import java.util.List; -import java.util.Set; -import java.util.UUID; - -import org.bukkit.ChatColor; -import org.bukkit.Effect; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import de.iani.playerUUIDCache.CachedPlayer; - -public class PriceChestCommandExecutor implements CommandExecutor { - private TreasureChest plugin; - - public PriceChestCommandExecutor(TreasureChest plugin) { - this.plugin = plugin; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (args.length == 0) { - displayHelp(sender, label); - } else { - String subcommand = args[0].toLowerCase(); - if (subcommand.equals("setchest")) { - if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.setchest")) { - return true; - } - Player player = ((Player) sender); - Block target = player.getTargetBlock((Set) null, 5); - plugin.setChestLocation(target.getLocation()); - player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); - player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); - player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); - plugin.sendMessage(sender, "Treasurechest location set!"); - } else if (subcommand.equals("create")) { - if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { - return true; - } - Player player = ((Player) sender); - ItemStack inHand = player.getInventory().getItemInMainHand(); - if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) { - plugin.sendMessage(sender, "You have to hold the display item in hand!", true); - return true; - } - TreasureChestItem newItem = new TreasureChestItem(inHand.clone(), null, 0); - plugin.getData().setActiveItem(player.getUniqueId(), newItem); - plugin.sendMessage(sender, "Created a new Treasurechest item!"); - } else if (subcommand.equals("addmoney")) { - if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { - return true; - } - if (args.length < 2) { - plugin.sendMessage(sender, "/" + label + " addmoney ", true); - return true; - } - int amount = getIntArgument(args[1], 0); - Player player = ((Player) sender); - TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); - if (activeItem == null) { - plugin.sendMessage(sender, "You have no active item!", true); - return true; - } - activeItem.setPriceMoney(activeItem.getPriceMoney() + amount); - plugin.sendMessage(sender, "Set the money to " + activeItem.getPriceMoney()); - } else if (subcommand.equals("additem")) { - if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { - return true; - } - Player player = ((Player) sender); - ItemStack inHand = player.getInventory().getItemInMainHand(); - if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) { - plugin.sendMessage(sender, "You have to hold the item in hand!", true); - return true; - } - TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); - if (activeItem == null) { - plugin.sendMessage(sender, "You have no active item!", true); - return true; - } - activeItem.addPriceItem(inHand.clone()); - plugin.sendMessage(sender, "Item added: " + inHand.getAmount() + " " + TreasureChest.capitalize(inHand.getType().name(), true)); - } else if (subcommand.equals("give")) { - if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.give")) { - return true; - } - if (args.length < 2) { - plugin.sendMessage(sender, "/" + label + " give ", true); - return true; - } - Player player = ((Player) sender); - TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); - if (activeItem == null) { - plugin.sendMessage(sender, "You have no active item!", true); - return true; - } - - for (int arg = 1; arg < args.length; arg++) { - String nameOrId = args[arg].replace(",", "").trim(); - UUID targetuuid = null; - try { - targetuuid = UUID.fromString(nameOrId); - } catch (Exception e) { - CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); - if (target != null) { - targetuuid = target.getUUID(); - nameOrId = target.getName(); - } - } - if (targetuuid == null) { - plugin.sendMessage(sender, "Unknown player!", true); - } else { - PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); - content.addItem(activeItem); - plugin.sendMessage(sender, "Item given to: " + nameOrId + " (" + targetuuid.toString() + ")"); - } - } - return true; - } else if (subcommand.equals("list")) { - if (!checkPermission(sender, "pricechest.list")) { - return true; - } - if (args.length < 2) { - plugin.sendMessage(sender, "/" + label + " list ", true); - return true; - } - String nameOrId = args[1]; - UUID targetuuid = null; - try { - targetuuid = UUID.fromString(nameOrId); - } catch (Exception e) { - CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); - if (target != null) { - targetuuid = target.getUUID(); - nameOrId = target.getName(); - } - } - if (targetuuid == null) { - plugin.sendMessage(sender, "Unknown player!", true); - return true; - } - - PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); - plugin.sendMessage(sender, ChatColor.GRAY + "Preise von " + nameOrId + " (" + targetuuid.toString() + "):"); - List items = content.getItems(); - if (items.isEmpty()) { - plugin.sendMessage(sender, "keine Preise vorhanden"); - } else { - int nr = 1; - for (TreasureChestItem i : items) { - plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName()); - nr++; - } - } - } else if (subcommand.equals("remove")) { - if (!checkPermission(sender, "pricechest.remove")) { - return true; - } - if (args.length < 3) { - plugin.sendMessage(sender, "/" + label + " remove ", true); - return true; - } - - String nameOrId = args[1]; - UUID targetuuid = null; - try { - targetuuid = UUID.fromString(nameOrId); - } catch (Exception e) { - CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); - if (target != null) { - targetuuid = target.getUUID(); - nameOrId = target.getName(); - } - } - if (targetuuid == null) { - plugin.sendMessage(sender, "Unknown player!", true); - return true; - } - int nr = getIntArgument(args[2], -1); - PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); - if (!content.removeItem(nr - 1)) { - plugin.sendMessage(sender, "Ungültige ID", true); - return true; - } - plugin.sendMessage(sender, "Der Preis wurde entfernt!"); - } else { - plugin.sendMessage(sender, "Unknown subcommand!", true); - return true; - } - } - return true; - } - - private void displayHelp(CommandSender sender, String label) { - plugin.sendMessage(sender, ChatColor.GREEN + "Commands"); - if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.setchest", true)) { - plugin.sendMessage(sender, "/" + label + " setchest"); - plugin.sendMessage(sender, ChatColor.GREEN + " Set the treasure chest location to the location you are looking at."); - } - if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.create", true)) { - plugin.sendMessage(sender, "/" + label + " create"); - plugin.sendMessage(sender, ChatColor.GREEN + " Creates a price with the item in hand as display item."); - plugin.sendMessage(sender, "/" + label + " additem"); - plugin.sendMessage(sender, ChatColor.GREEN + " Adds the item in hand to the price."); - plugin.sendMessage(sender, "/" + label + " addmoney "); - plugin.sendMessage(sender, ChatColor.GREEN + " Adds money to a price."); - } - if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.give", true)) { - plugin.sendMessage(sender, "/" + label + " give "); - plugin.sendMessage(sender, ChatColor.GREEN + " Gives a price to a player."); - } - if (checkPermission(sender, "pricechest.list")) { - plugin.sendMessage(sender, "/" + label + " list "); - plugin.sendMessage(sender, ChatColor.GREEN + " Gives price for a player."); - } - if (checkPermission(sender, "pricechest.remove")) { - plugin.sendMessage(sender, "/" + label + " remove "); - plugin.sendMessage(sender, ChatColor.GREEN + " Removes a price from a players chest."); - } - } - - private int getIntArgument(String value, int defaultValue) { - try { - return Integer.parseInt(value); - } catch (Exception e) { - // ignore - return default - } - return defaultValue; - } - - private boolean checkPermission(CommandSender sender, String perm) { - return checkPermission(sender, perm, false); - } - - private boolean checkPermission(CommandSender sender, String perm, boolean silent) { - boolean hasPermission = sender.hasPermission(perm); - if (!silent && !hasPermission) { - plugin.sendMessage(sender, "No permission!", true); - } - return hasPermission; - } - - private boolean checkPlayer(CommandSender sender) { - return checkPlayer(sender, false); - } - - private boolean checkPlayer(CommandSender sender, boolean silent) { - boolean isPlayer = sender instanceof Player; - if (!isPlayer && !silent) { - plugin.sendMessage(sender, "You must be a player!", true); - } - return isPlayer; - } -} diff --git a/src/main/java/de/iani/treasurechest/PriceChestData.java b/src/main/java/de/iani/treasurechest/PriceChestData.java deleted file mode 100644 index 1ba6432..0000000 --- a/src/main/java/de/iani/treasurechest/PriceChestData.java +++ /dev/null @@ -1,84 +0,0 @@ -package de.iani.treasurechest; - -import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.UUID; - -import org.bukkit.entity.Player; - -public class PriceChestData { - private HashMap namedItems; - - private HashMap activeItems; - - private HashMap loadedChests; - - private TreasureChest plugin; - - private File chestContentFolder; - - public PriceChestData(TreasureChest plugin) { - namedItems = new HashMap<>(); - activeItems = new HashMap<>(); - loadedChests = new HashMap<>(); - - this.plugin = plugin; - chestContentFolder = new File(this.plugin.getDataFolder(), "content"); - chestContentFolder.mkdirs(); - } - - public TreasureChestItem getNamedItem(String name) { - return namedItems.get(name.toLowerCase().trim()); - } - - public TreasureChestItem getActiveItem(UUID playerUUID) { - return activeItems.get(playerUUID); - } - - public TreasureChestItem setActiveItem(UUID playerUUID, TreasureChestItem item) { - if (item == null) { - return removeActiveItem(playerUUID); - } - return activeItems.put(playerUUID, item); - } - - public TreasureChestItem removeActiveItem(UUID playerUUID) { - return activeItems.remove(playerUUID); - } - - public PlayerTreasureChestContent getChestContentIfLoaded(UUID playerUUID) { - return loadedChests.get(playerUUID); - } - - public PlayerTreasureChestContent getChestContent(UUID playerUUID) { - PlayerTreasureChestContent loaded = getChestContentIfLoaded(playerUUID); - if (loaded != null) { - return loaded; - } - return loadOrCreateChestContent(playerUUID); - } - - private PlayerTreasureChestContent loadOrCreateChestContent(UUID playerUUID) { - File playerData = new File(chestContentFolder, playerUUID.toString() + ".yml"); - PlayerTreasureChestContent content = new PlayerTreasureChestContent(plugin, playerData); - loadedChests.put(playerUUID, content); - return content; - } - - public void doGC() { - long t = System.currentTimeMillis(); - for (Player player : plugin.getServer().getOnlinePlayers()) { - PlayerTreasureChestContent content = loadedChests.get(player.getUniqueId()); - if (content != null) { - content.setOnline(t); - } - } - Iterator it = loadedChests.values().iterator(); - while (it.hasNext()) { - if (!it.next().isOnline(t)) { - it.remove(); - } - } - } -} diff --git a/src/main/java/de/iani/treasurechest/TreasureChest.java b/src/main/java/de/iani/treasurechest/TreasureChest.java index bd4889b..7bc5b49 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChest.java +++ b/src/main/java/de/iani/treasurechest/TreasureChest.java @@ -24,7 +24,7 @@ import net.milkbowl.vault.economy.Economy; public class TreasureChest extends JavaPlugin implements TreasureChestAPI { - private PriceChestData data; + private TreasureChestData data; private Location chestLocation; @@ -46,8 +46,8 @@ playerUUIDCache = (PlayerUUIDCache) getServer().getPluginManager().getPlugin("PlayerUUIDCache"); readConfig(); // chestLocation = new Location(getServer().getWorlds().get(0), 308, 127, -879); - data = new PriceChestData(this); - getCommand("treasurechest").setExecutor(new PriceChestCommandExecutor(this)); + data = new TreasureChestData(this); + getCommand("treasurechest").setExecutor(new TreasureChestCommandExecutor(this)); getServer().getPluginManager().registerEvents(new ChestInventoryListener(this), this); getServer().getPluginManager().registerEvents(new PlayerEventListener(this), this); @@ -152,7 +152,7 @@ // return uuidTools; // } - public PriceChestData getData() { + public TreasureChestData getData() { return data; } diff --git a/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java b/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java new file mode 100644 index 0000000..38a68cc --- /dev/null +++ b/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java @@ -0,0 +1,261 @@ +package de.iani.treasurechest; + +import java.util.List; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.ChatColor; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import de.iani.playerUUIDCache.CachedPlayer; + +public class TreasureChestCommandExecutor implements CommandExecutor { + private TreasureChest plugin; + + public TreasureChestCommandExecutor(TreasureChest plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (args.length == 0) { + displayHelp(sender, label); + } else { + String subcommand = args[0].toLowerCase(); + if (subcommand.equals("setchest")) { + if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.setchest")) { + return true; + } + Player player = ((Player) sender); + Block target = player.getTargetBlock((Set) null, 5); + plugin.setChestLocation(target.getLocation()); + player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); + player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); + player.playEffect(target.getLocation(), Effect.MOBSPAWNER_FLAMES, null); + plugin.sendMessage(sender, "Treasurechest location set!"); + } else if (subcommand.equals("create")) { + if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { + return true; + } + Player player = ((Player) sender); + ItemStack inHand = player.getInventory().getItemInMainHand(); + if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) { + plugin.sendMessage(sender, "You have to hold the display item in hand!", true); + return true; + } + TreasureChestItem newItem = new TreasureChestItem(inHand.clone(), null, 0); + plugin.getData().setActiveItem(player.getUniqueId(), newItem); + plugin.sendMessage(sender, "Created a new Treasurechest item!"); + } else if (subcommand.equals("addmoney")) { + if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { + return true; + } + if (args.length < 2) { + plugin.sendMessage(sender, "/" + label + " addmoney ", true); + return true; + } + int amount = getIntArgument(args[1], 0); + Player player = ((Player) sender); + TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); + if (activeItem == null) { + plugin.sendMessage(sender, "You have no active item!", true); + return true; + } + activeItem.setPriceMoney(activeItem.getPriceMoney() + amount); + plugin.sendMessage(sender, "Set the money to " + activeItem.getPriceMoney()); + } else if (subcommand.equals("additem")) { + if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.create")) { + return true; + } + Player player = ((Player) sender); + ItemStack inHand = player.getInventory().getItemInMainHand(); + if (inHand == null || inHand.getType() == Material.AIR || inHand.getAmount() == 0) { + plugin.sendMessage(sender, "You have to hold the item in hand!", true); + return true; + } + TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); + if (activeItem == null) { + plugin.sendMessage(sender, "You have no active item!", true); + return true; + } + activeItem.addPriceItem(inHand.clone()); + plugin.sendMessage(sender, "Item added: " + inHand.getAmount() + " " + TreasureChest.capitalize(inHand.getType().name(), true)); + } else if (subcommand.equals("give")) { + if (!checkPlayer(sender) || !checkPermission(sender, "pricechest.give")) { + return true; + } + if (args.length < 2) { + plugin.sendMessage(sender, "/" + label + " give ", true); + return true; + } + Player player = ((Player) sender); + TreasureChestItem activeItem = plugin.getData().getActiveItem(player.getUniqueId()); + if (activeItem == null) { + plugin.sendMessage(sender, "You have no active item!", true); + return true; + } + + for (int arg = 1; arg < args.length; arg++) { + String nameOrId = args[arg].replace(",", "").trim(); + UUID targetuuid = null; + try { + targetuuid = UUID.fromString(nameOrId); + } catch (Exception e) { + CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); + if (target != null) { + targetuuid = target.getUUID(); + nameOrId = target.getName(); + } + } + if (targetuuid == null) { + plugin.sendMessage(sender, "Unknown player!", true); + } else { + PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); + content.addItem(activeItem); + plugin.sendMessage(sender, "Item given to: " + nameOrId + " (" + targetuuid.toString() + ")"); + } + } + return true; + } else if (subcommand.equals("list")) { + if (!checkPermission(sender, "pricechest.list")) { + return true; + } + if (args.length < 2) { + plugin.sendMessage(sender, "/" + label + " list ", true); + return true; + } + String nameOrId = args[1]; + UUID targetuuid = null; + try { + targetuuid = UUID.fromString(nameOrId); + } catch (Exception e) { + CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); + if (target != null) { + targetuuid = target.getUUID(); + nameOrId = target.getName(); + } + } + if (targetuuid == null) { + plugin.sendMessage(sender, "Unknown player!", true); + return true; + } + + PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); + plugin.sendMessage(sender, ChatColor.GRAY + "Preise von " + nameOrId + " (" + targetuuid.toString() + "):"); + List items = content.getItems(); + if (items.isEmpty()) { + plugin.sendMessage(sender, "keine Preise vorhanden"); + } else { + int nr = 1; + for (TreasureChestItem i : items) { + plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName()); + nr++; + } + } + } else if (subcommand.equals("remove")) { + if (!checkPermission(sender, "pricechest.remove")) { + return true; + } + if (args.length < 3) { + plugin.sendMessage(sender, "/" + label + " remove ", true); + return true; + } + + String nameOrId = args[1]; + UUID targetuuid = null; + try { + targetuuid = UUID.fromString(nameOrId); + } catch (Exception e) { + CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(nameOrId, true); + if (target != null) { + targetuuid = target.getUUID(); + nameOrId = target.getName(); + } + } + if (targetuuid == null) { + plugin.sendMessage(sender, "Unknown player!", true); + return true; + } + int nr = getIntArgument(args[2], -1); + PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); + if (!content.removeItem(nr - 1)) { + plugin.sendMessage(sender, "Ungültige ID", true); + return true; + } + plugin.sendMessage(sender, "Der Preis wurde entfernt!"); + } else { + plugin.sendMessage(sender, "Unknown subcommand!", true); + return true; + } + } + return true; + } + + private void displayHelp(CommandSender sender, String label) { + plugin.sendMessage(sender, ChatColor.GREEN + "Commands"); + if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.setchest", true)) { + plugin.sendMessage(sender, "/" + label + " setchest"); + plugin.sendMessage(sender, ChatColor.GREEN + " Set the treasure chest location to the location you are looking at."); + } + if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.create", true)) { + plugin.sendMessage(sender, "/" + label + " create"); + plugin.sendMessage(sender, ChatColor.GREEN + " Creates a price with the item in hand as display item."); + plugin.sendMessage(sender, "/" + label + " additem"); + plugin.sendMessage(sender, ChatColor.GREEN + " Adds the item in hand to the price."); + plugin.sendMessage(sender, "/" + label + " addmoney "); + plugin.sendMessage(sender, ChatColor.GREEN + " Adds money to a price."); + } + if (checkPlayer(sender, true) && checkPermission(sender, "pricechest.give", true)) { + plugin.sendMessage(sender, "/" + label + " give "); + plugin.sendMessage(sender, ChatColor.GREEN + " Gives a price to a player."); + } + if (checkPermission(sender, "pricechest.list")) { + plugin.sendMessage(sender, "/" + label + " list "); + plugin.sendMessage(sender, ChatColor.GREEN + " Gives price for a player."); + } + if (checkPermission(sender, "pricechest.remove")) { + plugin.sendMessage(sender, "/" + label + " remove "); + plugin.sendMessage(sender, ChatColor.GREEN + " Removes a price from a players chest."); + } + } + + private int getIntArgument(String value, int defaultValue) { + try { + return Integer.parseInt(value); + } catch (Exception e) { + // ignore - return default + } + return defaultValue; + } + + private boolean checkPermission(CommandSender sender, String perm) { + return checkPermission(sender, perm, false); + } + + private boolean checkPermission(CommandSender sender, String perm, boolean silent) { + boolean hasPermission = sender.hasPermission(perm); + if (!silent && !hasPermission) { + plugin.sendMessage(sender, "No permission!", true); + } + return hasPermission; + } + + private boolean checkPlayer(CommandSender sender) { + return checkPlayer(sender, false); + } + + private boolean checkPlayer(CommandSender sender, boolean silent) { + boolean isPlayer = sender instanceof Player; + if (!isPlayer && !silent) { + plugin.sendMessage(sender, "You must be a player!", true); + } + return isPlayer; + } +} diff --git a/src/main/java/de/iani/treasurechest/TreasureChestData.java b/src/main/java/de/iani/treasurechest/TreasureChestData.java new file mode 100644 index 0000000..c38e0ff --- /dev/null +++ b/src/main/java/de/iani/treasurechest/TreasureChestData.java @@ -0,0 +1,84 @@ +package de.iani.treasurechest; + +import java.io.File; +import java.util.HashMap; +import java.util.Iterator; +import java.util.UUID; + +import org.bukkit.entity.Player; + +public class TreasureChestData { + private HashMap namedItems; + + private HashMap activeItems; + + private HashMap loadedChests; + + private TreasureChest plugin; + + private File chestContentFolder; + + public TreasureChestData(TreasureChest plugin) { + namedItems = new HashMap<>(); + activeItems = new HashMap<>(); + loadedChests = new HashMap<>(); + + this.plugin = plugin; + chestContentFolder = new File(this.plugin.getDataFolder(), "content"); + chestContentFolder.mkdirs(); + } + + public TreasureChestItem getNamedItem(String name) { + return namedItems.get(name.toLowerCase().trim()); + } + + public TreasureChestItem getActiveItem(UUID playerUUID) { + return activeItems.get(playerUUID); + } + + public TreasureChestItem setActiveItem(UUID playerUUID, TreasureChestItem item) { + if (item == null) { + return removeActiveItem(playerUUID); + } + return activeItems.put(playerUUID, item); + } + + public TreasureChestItem removeActiveItem(UUID playerUUID) { + return activeItems.remove(playerUUID); + } + + public PlayerTreasureChestContent getChestContentIfLoaded(UUID playerUUID) { + return loadedChests.get(playerUUID); + } + + public PlayerTreasureChestContent getChestContent(UUID playerUUID) { + PlayerTreasureChestContent loaded = getChestContentIfLoaded(playerUUID); + if (loaded != null) { + return loaded; + } + return loadOrCreateChestContent(playerUUID); + } + + private PlayerTreasureChestContent loadOrCreateChestContent(UUID playerUUID) { + File playerData = new File(chestContentFolder, playerUUID.toString() + ".yml"); + PlayerTreasureChestContent content = new PlayerTreasureChestContent(plugin, playerData); + loadedChests.put(playerUUID, content); + return content; + } + + public void doGC() { + long t = System.currentTimeMillis(); + for (Player player : plugin.getServer().getOnlinePlayers()) { + PlayerTreasureChestContent content = loadedChests.get(player.getUniqueId()); + if (content != null) { + content.setOnline(t); + } + } + Iterator it = loadedChests.values().iterator(); + while (it.hasNext()) { + if (!it.next().isOnline(t)) { + it.remove(); + } + } + } +}