diff --git a/src/main/java/de/iani/treasurechest/Converter.java b/src/main/java/de/iani/treasurechest/Converter.java new file mode 100644 index 0000000..bd2664c --- /dev/null +++ b/src/main/java/de/iani/treasurechest/Converter.java @@ -0,0 +1,98 @@ +package de.iani.treasurechest; + +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class Converter { + + private TreasureChest plugin; + + public Converter(TreasureChest plugin) { + this.plugin = plugin; + } + + public void convertAll() { + File chestContentFolder = new File(this.plugin.getDataFolder(), "content"); + if (!chestContentFolder.isDirectory()) { + return; + } + File[] treasureChestFiles = chestContentFolder.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.getName().endsWith(".yml"); + } + }); + plugin.getLogger().info("Konvertiere " + treasureChestFiles.length + " Dateien"); + int i = 0; + for (File file : treasureChestFiles) { + try { + UUID owner = UUID.fromString(file.getName().substring(0, file.getName().length() - 4)); + convertPlayer(owner, file); + } catch (Exception e) { + plugin.getLogger().log(Level.SEVERE, "Could not convert " + file.getName() + ": " + e.getMessage(), e); + } + i++; + if (i % 100 == 0) { + plugin.getLogger().info(i + "/" + treasureChestFiles.length); + } + } + if (chestContentFolder.listFiles().length == 0) { + chestContentFolder.delete(); + } + plugin.getLogger().info(i + "/" + treasureChestFiles.length); + + File uuidFile = new File(plugin.getDataFolder(), "playerUUIDs.yml"); + if (uuidFile.exists()) { + uuidFile.delete(); + } + } + + public void convertPlayer(UUID owner, File file) { + try { + if (file.exists()) { + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + + ConfigurationSection prices = conf.getConfigurationSection("prices"); + if (prices != null) { + for (String e : prices.getKeys(false)) { + ConfigurationSection price = prices.getConfigurationSection(e); + if (price != null) { + ItemStack display = price.getItemStack("displayItem"); + if (display == null) { + display = new ItemStack(Material.BEDROCK); + ItemMeta meta = display.getItemMeta(); + meta.setDisplayName("Unset displayitem"); + display.setItemMeta(meta); + } + int priceMoney = price.getInt("priceMoney"); + ArrayList priceItems = new ArrayList<>(); + ConfigurationSection itemPricesSection = price.getConfigurationSection("itemPrices"); + if (itemPricesSection != null) { + for (String pricee : itemPricesSection.getKeys(false)) { + ItemStack priceItem = itemPricesSection.getItemStack(pricee); + if (priceItem != null) { + priceItems.add(priceItem); + } + } + } + TreasureChestItem item = new TreasureChestItem(display, priceItems.toArray(new ItemStack[priceItems.size()]), priceMoney); + plugin.getDatabase().addItem(owner, item); + } + } + } + } + } catch (Exception e) { + plugin.getLogger().log(Level.SEVERE, "Could not load user chest file: " + file.getName(), e); + } + file.delete(); + } +} diff --git a/src/main/java/de/iani/treasurechest/PlayerEventListener.java b/src/main/java/de/iani/treasurechest/PlayerEventListener.java index 36beaec..915f2c5 100644 --- a/src/main/java/de/iani/treasurechest/PlayerEventListener.java +++ b/src/main/java/de/iani/treasurechest/PlayerEventListener.java @@ -14,7 +14,7 @@ @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { - plugin.getData().loadTreasureChest(event.getPlayer().getUniqueId()); + plugin.getData().reloadTreasureChest(event.getPlayer().getUniqueId()); } @EventHandler diff --git a/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java b/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java index 769ed37..376ea17 100644 --- a/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java +++ b/src/main/java/de/iani/treasurechest/PlayerTreasureChestContent.java @@ -78,75 +78,6 @@ }); } - // public PlayerTreasureChestContent(UUID owner, TreasureChest plugin, File file) { - // this.plugin = plugin; - // this.file = file; - // try { - // if (file.exists()) { - // YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); - // - // ConfigurationSection prices = conf.getConfigurationSection("prices"); - // if (prices != null) { - // for (String e : prices.getKeys(false)) { - // ConfigurationSection price = prices.getConfigurationSection(e); - // if (price != null) { - // ItemStack display = price.getItemStack("displayItem"); - // if (display == null) { - // display = new ItemStack(Material.BEDROCK); - // ItemMeta meta = display.getItemMeta(); - // meta.setDisplayName("Unset displayitem"); - // display.setItemMeta(meta); - // } - // int priceMoney = price.getInt("priceMoney"); - // ArrayList priceItems = new ArrayList<>(); - // ConfigurationSection itemPricesSection = price.getConfigurationSection("itemPrices"); - // if (itemPricesSection != null) { - // for (String pricee : itemPricesSection.getKeys(false)) { - // ItemStack priceItem = itemPricesSection.getItemStack(pricee); - // if (priceItem != null) { - // priceItems.add(priceItem); - // } - // } - // } - // if (items == null) { - // items = new ArrayList<>(); - // } - // items.add(new TreasureChestItem(display, priceItems.toArray(new ItemStack[priceItems.size()]), priceMoney)); - // } - // } - // } - // } - // } catch (Exception e) { - // plugin.getLogger().log(Level.SEVERE, "Could not load user chest file: " + file.getName(), e); - // } - // } - - // private void save() { - // file.getParentFile().mkdirs(); - // YamlConfiguration conf = new YamlConfiguration(); - // ConfigurationSection prices = conf.createSection("prices"); - // if (items != null) { - // int nr = 0; - // for (TreasureChestItem i : items) { - // ConfigurationSection price = prices.createSection(Integer.toString(nr++)); - // price.set("displayItem", i.getDisplayItem().clone()); - // price.set("priceMoney", i.getPriceMoney()); - // ConfigurationSection itemsSec = price.createSection("itemPrices"); - // if (i.getPriceItems() != null) { - // int nr2 = 0; - // for (ItemStack st : i.getPriceItems()) { - // itemsSec.set(Integer.toString(nr2++), st.clone()); - // } - // } - // } - // } - // try { - // conf.save(file); - // } catch (IOException e) { - // plugin.getLogger().log(Level.SEVERE, "Could not save user chest file: " + file.getName(), e); - // } - // } - void addItem(DatabaseTreasureChestItem item) { item = item.clone(); if (items == null) { diff --git a/src/main/java/de/iani/treasurechest/TreasureChest.java b/src/main/java/de/iani/treasurechest/TreasureChest.java index 4b69993..657369e 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChest.java +++ b/src/main/java/de/iani/treasurechest/TreasureChest.java @@ -65,6 +65,8 @@ return; } + new Converter(this).convertAll(); + workerThread = new WorkerThread(this); data = new TreasureChestData(this); @@ -138,7 +140,7 @@ cc.addItem(added); } } - }; + }.runTask(TreasureChest.this); } } catch (SQLException e) { getLogger().log(Level.SEVERE, "Could not add treasure chest item to database: " + e.getMessage(), e); diff --git a/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java b/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java index 368e210..206cf8e 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java +++ b/src/main/java/de/iani/treasurechest/TreasureChestCommandExecutor.java @@ -3,7 +3,6 @@ import java.sql.SQLException; import java.util.List; import java.util.Set; -import java.util.UUID; import java.util.logging.Level; import org.bukkit.ChatColor; @@ -117,7 +116,7 @@ plugin.sendMessage(sender, "Unknown player!", true); } else { plugin.addItem(target, activeItem.getDisplayItem(), activeItem.getPriceItems(), activeItem.getPriceMoney()); - plugin.sendMessage(sender, "Item given to: " + target.getName() + " (" + target.getUUID() + ")"); + plugin.sendMessage(sender, "Item given to: " + target.getName()); } } return true; @@ -129,42 +128,37 @@ 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) { + CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args[1], true); + if (target == 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 { - ListedItemsData lid = new ListedItemsData(targetuuid); - int nr = 1; - for (DatabaseTreasureChestItem i : items) { - plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName()); - lid.addItem(nr, i.getId()); - nr++; + PlayerTreasureChestContent content = plugin.getData().getOrCreateChestContent(target.getUniqueId()); + content.loadAsync(new Runnable() { + @Override + public void run() { + plugin.sendMessage(sender, ChatColor.GRAY + "Preise von " + target.getName() + " (" + target.getUniqueId().toString() + "):"); + List items = content.getItems(); + if (items.isEmpty()) { + plugin.sendMessage(sender, "keine Preise vorhanden"); + } else { + ListedItemsData lid = new ListedItemsData(target.getUniqueId()); + int nr = 1; + for (DatabaseTreasureChestItem i : items) { + plugin.sendMessage(sender, nr + ": " + i.getDisplayItem().getItemMeta().getDisplayName()); + lid.addItem(nr, i.getId()); + nr++; + } + if (sender instanceof Player) { + Player player = ((Player) sender); + plugin.getData().setListedItems(player.getUniqueId(), lid); + } else { + plugin.getData().setListedItems(null, lid); + } + } } - if (sender instanceof Player) { - Player player = ((Player) sender); - plugin.getData().setListedItems(player.getUniqueId(), lid); - } else { - plugin.getData().setListedItems(null, lid); - } - } + }); } else if (subcommand.equals("remove")) { if (!checkPermission(sender, "treasurechest.remove")) { return true; @@ -174,18 +168,9 @@ 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) { + CachedPlayer target = plugin.getPlayerUUIDCache().getPlayerFromNameOrUUID(args[1], true); + + if (target == null) { plugin.sendMessage(sender, "Unknown player!", true); return true; } @@ -198,7 +183,7 @@ } else { lid = plugin.getData().getListedItems(null); } - if (lid == null || !lid.getOwner().equals(targetuuid)) { + if (lid == null || !lid.getOwner().equals(target.getUniqueId())) { plugin.sendMessage(sender, "Nicht der gelistete Spieler", true); return true; } @@ -208,8 +193,8 @@ return true; } try { - if (plugin.getDatabase().deleteItem(targetuuid, key)) { - PlayerTreasureChestContent content = plugin.getData().getChestContent(targetuuid); + if (plugin.getDatabase().deleteItem(target.getUniqueId(), key)) { + PlayerTreasureChestContent content = plugin.getData().getChestContent(target.getUniqueId()); if (content != null && content.getLoadState() == LoadState.LOADED) { content.removeItem(key); } @@ -219,7 +204,7 @@ } } catch (SQLException e) { plugin.sendMessage(sender, ChatColor.DARK_RED + "Datenbankfehler"); - plugin.getLogger().log(Level.SEVERE, "Could not delete item " + key + " for " + targetuuid + ": " + e.getMessage(), e); + plugin.getLogger().log(Level.SEVERE, "Could not delete item " + key + " for " + target.getName() + ": " + e.getMessage(), e); return true; } plugin.sendMessage(sender, "Der Preis wurde entfernt!"); diff --git a/src/main/java/de/iani/treasurechest/TreasureChestData.java b/src/main/java/de/iani/treasurechest/TreasureChestData.java index 3c5cc6a..2f1d264 100644 --- a/src/main/java/de/iani/treasurechest/TreasureChestData.java +++ b/src/main/java/de/iani/treasurechest/TreasureChestData.java @@ -1,6 +1,5 @@ package de.iani.treasurechest; -import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.UUID; @@ -14,16 +13,12 @@ private TreasureChest plugin; - private File chestContentFolder; - public TreasureChestData(TreasureChest plugin) { activeItems = new HashMap<>(); loadedChests = new HashMap<>(); listedItems = new HashMap<>(); this.plugin = plugin; - chestContentFolder = new File(this.plugin.getDataFolder(), "content"); - chestContentFolder.mkdirs(); } public TreasureChestItem getActiveItem(UUID playerUUID) { @@ -37,15 +32,24 @@ return activeItems.put(playerUUID, item); } - public TreasureChestItem removeActiveItem(UUID playerUUID) { - return activeItems.remove(playerUUID); + public TreasureChestItem removeActiveItem(UUID owner) { + return activeItems.remove(owner); } - public PlayerTreasureChestContent getChestContent(UUID playerUUID) { - return loadedChests.get(playerUUID); + public PlayerTreasureChestContent getOrCreateChestContent(UUID owner) { + PlayerTreasureChestContent content = loadedChests.get(owner); + if (content == null) { + content = new PlayerTreasureChestContent(owner, plugin); + loadedChests.put(owner, content); + } + return content; } - public void loadTreasureChest(UUID owner) { + public PlayerTreasureChestContent getChestContent(UUID owner) { + return loadedChests.get(owner); + } + + public void reloadTreasureChest(UUID owner) { loadedChests.put(owner, new PlayerTreasureChestContent(owner, plugin)); } diff --git a/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java b/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java index 94a5b99..6616037 100644 --- a/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java +++ b/src/main/java/de/iani/treasurechest/database/TreasureChestDatabase.java @@ -97,7 +97,6 @@ return new DatabaseTreasureChestItem(item.getDisplayItem(), item.getPriceItems(), item.getPriceMoney(), time, id); } }); - } public ArrayList getPlayerItems(UUID owner) throws SQLException {