diff --git a/pom.xml b/pom.xml index 00cfa83..fcdb4aa 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ tsp.headdb HeadDB - 1.1 + 1.2 jar HeadDB diff --git a/src/main/java/tsp/headdb/HeadDB.java b/src/main/java/tsp/headdb/HeadDB.java index 5648473..06a8566 100644 --- a/src/main/java/tsp/headdb/HeadDB.java +++ b/src/main/java/tsp/headdb/HeadDB.java @@ -15,6 +15,7 @@ public class HeadDB extends JavaPlugin { private static HeadDB instance; private static Config config; + private static Config playerdata; @Override public void onEnable() { @@ -22,6 +23,8 @@ public class HeadDB extends JavaPlugin { Log.info("Loading HeadDB - " + getDescription().getVersion()); saveDefaultConfig(); config = new Config("plugins/HeadDB/config.yml"); + playerdata = new Config("plugins/HeadDB/playerdata.yml"); + playerdata.create(); Log.debug("Starting metrics..."); new Metrics(this, Utils.METRICS_ID); @@ -43,6 +46,10 @@ public class HeadDB extends JavaPlugin { return config; } + public static Config getPlayerdata() { + return playerdata; + } + public static HeadDB getInstance() { return instance; } diff --git a/src/main/java/tsp/headdb/api/Head.java b/src/main/java/tsp/headdb/api/Head.java index 1a1a589..f78b15f 100644 --- a/src/main/java/tsp/headdb/api/Head.java +++ b/src/main/java/tsp/headdb/api/Head.java @@ -11,7 +11,7 @@ import tsp.headdb.util.Log; import tsp.headdb.util.Utils; import java.lang.reflect.Field; -import java.util.Collections; +import java.util.Arrays; import java.util.UUID; public class Head { @@ -29,24 +29,25 @@ public class Head { Validate.notNull(category, "category must not be null!"); ItemStack item = new ItemStack(Material.PLAYER_HEAD); - if (item != null) { - SkullMeta meta = (SkullMeta) item.getItemMeta(); - meta.setDisplayName(Utils.colorize(category.getColor() + name)); - // set skull owner - GameProfile profile = new GameProfile(uuid, name); - profile.getProperties().put("textures", new Property("textures", value)); - Field profileField; - try { - profileField = meta.getClass().getDeclaredField("profile"); - profileField.setAccessible(true); - profileField.set(meta, profile); - } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) { - Log.error("Could not set skull owner for " + uuid.toString() + " | Stack Trace:"); - e1.printStackTrace(); - } - meta.setLore(Collections.singletonList(Utils.colorize("&cID: " + id))); - item.setItemMeta(meta); + SkullMeta meta = (SkullMeta) item.getItemMeta(); + meta.setDisplayName(Utils.colorize(category.getColor() + name)); + // set skull owner + GameProfile profile = new GameProfile(uuid, name); + profile.getProperties().put("textures", new Property("textures", value)); + Field profileField; + try { + profileField = meta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + profileField.set(meta, profile); + } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e1) { + Log.error("Could not set skull owner for " + uuid.toString() + " | Stack Trace:"); + e1.printStackTrace(); } + meta.setLore(Arrays.asList( + Utils.colorize("&cID: " + id), + Utils.colorize("&8Right-Click to add/remove from favorites.") + )); + item.setItemMeta(meta); return item; } diff --git a/src/main/java/tsp/headdb/api/HeadAPI.java b/src/main/java/tsp/headdb/api/HeadAPI.java index c0f1860..20d963e 100644 --- a/src/main/java/tsp/headdb/api/HeadAPI.java +++ b/src/main/java/tsp/headdb/api/HeadAPI.java @@ -1,10 +1,12 @@ package tsp.headdb.api; import org.bukkit.entity.Player; +import tsp.headdb.HeadDB; import tsp.headdb.database.Category; import tsp.headdb.database.HeadDatabase; import tsp.headdb.inventory.InventoryUtils; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -50,6 +52,38 @@ public class HeadAPI { return HeadDatabase.getHeads(); } + public static void addFavoriteHead(UUID uuid, int id) { + List favs = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + if (!favs.contains(id)) { + favs.add(id); + } + HeadDB.getPlayerdata().set(uuid.toString() + ".favorites", favs); + HeadDB.getPlayerdata().save(); + } + + public static void removeFavoriteHead(UUID uuid, int id) { + List favs = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + for (int i = 0; i < favs.size(); i++) { + if (favs.get(i) == id) { + favs.remove(i); + break; + } + } + HeadDB.getPlayerdata().set(uuid.toString() + ".favorites", favs); + HeadDB.getPlayerdata().save(); + } + + public static List getFavoriteHeads(UUID uuid) { + List heads = new ArrayList<>(); + List ids = HeadDB.getPlayerdata().getIntList(uuid.toString() + ".favorites"); + for (int id : ids) { + Head head = getHeadByID(id); + heads.add(head); + } + + return heads; + } + public static void updateDatabase() { HeadDatabase.update(); } diff --git a/src/main/java/tsp/headdb/inventory/InventoryUtils.java b/src/main/java/tsp/headdb/inventory/InventoryUtils.java index aaa0225..3277044 100644 --- a/src/main/java/tsp/headdb/inventory/InventoryUtils.java +++ b/src/main/java/tsp/headdb/inventory/InventoryUtils.java @@ -1,6 +1,7 @@ package tsp.headdb.inventory; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.Inventory; @@ -17,6 +18,32 @@ import java.util.List; public class InventoryUtils { + public static void openFavoritesMenu(Player player) { + PagedPane pane = new PagedPane(4, 6, Utils.colorize("&c&lHeadDB - &eFavorites: " + player.getName())); + + List heads = HeadAPI.getFavoriteHeads(player.getUniqueId()); + for (Head head : heads) { + pane.addButton(new Button(head.getItemStack(), e -> { + if (e.getClick() == ClickType.SHIFT_LEFT) { + ItemStack item = head.getItemStack(); + item.setAmount(64); + player.getInventory().addItem(item); + return; + } + if (e.getClick() == ClickType.LEFT) { + player.getInventory().addItem(head.getItemStack()); + } + if (e.getClick() == ClickType.RIGHT) { + HeadAPI.removeFavoriteHead(player.getUniqueId(), head.getId()); + openFavoritesMenu(player); + Utils.sendMessage(player, "Removed &e" + head.getName() + " &8from favorites."); + } + })); + } + + pane.open(player); + } + public static void openSearchDatabase(Player player, String search) { PagedPane pane = new PagedPane(4, 6, Utils.colorize("&c&lHeadDB - &eSearch: " + search)); @@ -29,7 +56,13 @@ public class InventoryUtils { player.getInventory().addItem(item); return; } - player.getInventory().addItem(head.getItemStack()); + if (e.getClick() == ClickType.LEFT) { + player.getInventory().addItem(head.getItemStack()); + } + if (e.getClick() == ClickType.RIGHT) { + HeadAPI.addFavoriteHead(player.getUniqueId(), head.getId()); + Utils.sendMessage(player, "Added &e" + head.getName() + " &8to favorites."); + } })); } @@ -48,7 +81,13 @@ public class InventoryUtils { player.getInventory().addItem(item); return; } - player.getInventory().addItem(head.getItemStack()); + if (e.getClick() == ClickType.LEFT) { + player.getInventory().addItem(head.getItemStack()); + } + if (e.getClick() == ClickType.RIGHT) { + HeadAPI.addFavoriteHead(player.getUniqueId(), head.getId()); + Utils.sendMessage(player, "Added &e" + head.getName() + " &8to favorites."); + } })); } @@ -56,7 +95,7 @@ public class InventoryUtils { } public static void openDatabase(Player player) { - Inventory inventory = Bukkit.createInventory(null, 54, Utils.colorize("&c&lHeadDB")); + Inventory inventory = Bukkit.createInventory(null, 54, Utils.colorize("&c&lHeadDB &8(" + HeadAPI.getHeads().size() + ")")); fillBorder(inventory, XMaterial.BLACK_STAINED_GLASS_PANE.parseItem()); for (Category category : Category.getCategories()) { @@ -70,6 +109,12 @@ public class InventoryUtils { inventory.addItem(item); } + ItemStack fav = XMaterial.BOOK.parseItem(); + ItemMeta meta = fav.getItemMeta(); + meta.setDisplayName(Utils.colorize("&eFavorites")); + fav.setItemMeta(meta); + inventory.setItem(37, fav); + player.openInventory(inventory); } diff --git a/src/main/java/tsp/headdb/listener/MenuListener.java b/src/main/java/tsp/headdb/listener/MenuListener.java index 4de72aa..57e8e28 100644 --- a/src/main/java/tsp/headdb/listener/MenuListener.java +++ b/src/main/java/tsp/headdb/listener/MenuListener.java @@ -24,6 +24,7 @@ public class MenuListener implements Listener { if (!(e.getWhoClicked() instanceof Player)) { return; } + Player player = (Player) e.getWhoClicked(); if (e.getView().getTitle().startsWith(Utils.colorize("&c&lHeadDB"))) { e.setCancelled(true); Inventory inventory = e.getClickedInventory(); @@ -34,11 +35,19 @@ public class MenuListener implements Listener { if (item != null && item.getType() != XMaterial.AIR.parseMaterial()) { String name = ChatColor.stripColor(item.getItemMeta().getDisplayName().toLowerCase()); + if (name.equalsIgnoreCase("favorites")) { + if (!player.hasPermission("headdb.favorites")) { + Utils.sendMessage(player, "&cYou do not have permission for favorites!"); + player.closeInventory(); + return; + } + InventoryUtils.openFavoritesMenu(player); + return; + } Category category = Category.getByName(name); if (category != null) { - InventoryUtils.openCategoryDatabase((Player) e.getWhoClicked(), category); - + InventoryUtils.openCategoryDatabase(player, category); } } } diff --git a/src/main/java/tsp/headdb/util/Config.java b/src/main/java/tsp/headdb/util/Config.java index bf6f5cf..625dc4e 100644 --- a/src/main/java/tsp/headdb/util/Config.java +++ b/src/main/java/tsp/headdb/util/Config.java @@ -48,6 +48,10 @@ public class Config { return config.getInt(path); } + public List getIntList(String path) { + return config.getIntegerList(path); + } + public long getLong(String path) { return config.getLong(path); } diff --git a/src/main/java/tsp/headdb/util/Log.java b/src/main/java/tsp/headdb/util/Log.java index 4ecafe3..023736e 100644 --- a/src/main/java/tsp/headdb/util/Log.java +++ b/src/main/java/tsp/headdb/util/Log.java @@ -2,6 +2,7 @@ package tsp.headdb.util; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import tsp.headdb.HeadDB; import java.io.PrintWriter; import java.io.StringWriter; @@ -34,6 +35,9 @@ public class Log { } public static void log(LogLevel level, String message) { + if (level == LogLevel.DEBUG && !HeadDB.getCfg().getBoolean("debug")) { + return; + } Bukkit.getConsoleSender().sendMessage(Utils.colorize("&7[&9&l" + name + "&7] " + level.getColor() + "[" + level.name() + "]: " + message)); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d815b93..81f0e9b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -2,4 +2,4 @@ refresh: 3600 # Debug Mode -debug: true \ No newline at end of file +debug: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 65d9a9b..041f6c1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: HeadDB description: Head Database main: tsp.headdb.HeadDB -version: 1.1 +version: 1.2 api-version: 1.16 author: Silent @@ -19,9 +19,12 @@ permissions: headdb.open: true headdb.search: true headdb.give: true + headdb.favorites: true headdb.open: default: op headdb.search: default: op headdb.give: + default: op + headdb.favorites: default: op \ No newline at end of file