diff --git a/pom.xml b/pom.xml index 874e5da..6a4086f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ tsp.headdb HeadDB - 3.0.2 + 3.1.0 jar HeadDB diff --git a/src/main/java/tsp/headdb/inventory/InventoryUtils.java b/src/main/java/tsp/headdb/inventory/InventoryUtils.java index 17e85ba..8a706f3 100644 --- a/src/main/java/tsp/headdb/inventory/InventoryUtils.java +++ b/src/main/java/tsp/headdb/inventory/InventoryUtils.java @@ -93,7 +93,6 @@ public class InventoryUtils { return; } if (e.getClick() == ClickType.RIGHT) { - player.closeInventory(); Utils.sendMessage(player, "&cLocal heads can not be added to favorites!"); } })); @@ -119,6 +118,7 @@ public class InventoryUtils { HeadAPI.removeFavoriteHead(player.getUniqueId(), head.getValue()); openFavoritesMenu(player); Utils.sendMessage(player, "&7Removed &e" + head.getName() + " &7from favorites."); + Utils.playSound(player, "removeFavorite"); } })); } @@ -140,8 +140,15 @@ public class InventoryUtils { purchaseHead(player, head, 1, head.getCategory().getName(), head.getName()); } if (e.getClick() == ClickType.RIGHT) { + if (!player.hasPermission("headdb.favorites")) { + Utils.sendMessage(player, "&cYou do not have permission for favorites!"); + Utils.playSound(player, "noPermission"); + return; + } + HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue()); Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites."); + Utils.playSound(player, "addFavorite"); } })); } @@ -164,8 +171,15 @@ public class InventoryUtils { purchaseHead(player, head, 1, head.getCategory().getName(), head.getName()); } if (e.getClick() == ClickType.RIGHT) { + if (!player.hasPermission("headdb.favorites")) { + Utils.sendMessage(player, "&cYou do not have permission for favorites!"); + Utils.playSound(player, "noPermission"); + return; + } + HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue()); Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites."); + Utils.playSound(player, "addFavorite"); } })); } @@ -187,8 +201,15 @@ public class InventoryUtils { purchaseHead(player, head, 1, head.getCategory().getName(), head.getName()); } if (e.getClick() == ClickType.RIGHT) { + if (!player.hasPermission("headdb.favorites")) { + Utils.sendMessage(player, "&cYou do not have permission for favorites!"); + Utils.playSound(player, "noPermission"); + return; + } + HeadAPI.addFavoriteHead(player.getUniqueId(), head.getValue()); Utils.sendMessage(player, "&7Added &e" + head.getName() + " &7to favorites."); + Utils.playSound(player, "addFavorite"); } })); } @@ -287,6 +308,7 @@ public class InventoryUtils { // Don't mention receiving it for free in this case, since it is always free. if (economy == null) { Utils.sendMessage(player, String.format("&7You received &e%d &7x &e%s&7!", amount, description)); + Utils.playSound(player, "noEconomy"); return true; } @@ -296,20 +318,24 @@ public class InventoryUtils { if (cost > 0) { if (economy.has(player, cost)) { economy.withdrawPlayer(player, cost); - Utils.sendMessage(player, String.format("&7You purchased &e%d &7x &e%s &7for &e%.2f %s&7!", amount, description, cost, economy.currencyNamePlural())); + Utils.sendMessage(player, String.format("&7You purchased &e%d &7x &e%s &7for &e%.2f&7!", amount, description, cost)); + Utils.playSound(player, "paid"); return true; } - Utils.sendMessage(player, String.format("&7You do not have enough &e%s &cto purchase &e%d &cx &e%s&7.", economy.currencyNamePlural(), amount, description)); + Utils.sendMessage(player, String.format("&cYou do not have enough to purchase &e%d &cx &e%s&7.", amount, description)); + Utils.playSound(player, "unavailable"); return false; } // Otherwise, the item is free. Utils.sendMessage(player, String.format("&7You received &e%d &7x &e%s &7for &efree&7!", amount, description)); + Utils.playSound(player, "free"); return true; } public static void purchaseHead(Player player, Head head, int amount, String category, String description) { if (!processPayment(player, amount, category, description)) return; + PlayerHeadPurchaseEvent event = new PlayerHeadPurchaseEvent(player, head, getCategoryCost(player, category)); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { diff --git a/src/main/java/tsp/headdb/listener/MenuListener.java b/src/main/java/tsp/headdb/listener/MenuListener.java index 09ae243..d408dd8 100644 --- a/src/main/java/tsp/headdb/listener/MenuListener.java +++ b/src/main/java/tsp/headdb/listener/MenuListener.java @@ -40,23 +40,34 @@ public class MenuListener implements Listener { 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(); + Utils.sendMessage(player, "&cYou do not have permission for favorites!"); + Utils.playSound(player, "noPermission"); return; } InventoryUtils.openFavoritesMenu(player); + Utils.playSound(player, "open"); return; } if (name.equalsIgnoreCase("local")) { if (!player.hasPermission("headdb.local")) { - Utils.sendMessage(player, "&cYou do not have permission to view local heads!"); player.closeInventory(); + Utils.sendMessage(player, "&cYou do not have permission to view local heads!"); + Utils.playSound(player, "noPermission"); return; } InventoryUtils.openLocalMenu(player); + Utils.playSound(player, "open"); return; } if (name.equalsIgnoreCase("search")) { + if (!player.hasPermission("headdb.search")) { + player.closeInventory(); + Utils.sendMessage(player, "&cYou do not have permission for the search function!"); + Utils.playSound(player, "noPermission"); + return; + } + new AnvilGUI.Builder() .onComplete((p, text) -> { InventoryUtils.openSearchDatabase(p, text); @@ -66,12 +77,20 @@ public class MenuListener implements Listener { .text("Name...") .plugin(HeadDB.getInstance()) .open(player); + Utils.playSound(player, "open"); return; } Category category = Category.getByName(name); if (category != null) { + if (HeadDB.getInstance().getConfig().getBoolean("requireCategoryPermission") && !player.hasPermission("headdb.category." + category)) { + Utils.sendMessage(player, "&cYou do not have permission for this category! (&e" + category.getName() + "&c)"); + Utils.playSound(player, "noPermission"); + return; + } + + Utils.playSound(player, "open"); HeadAPI.openCategoryDatabase(player, category); } } diff --git a/src/main/java/tsp/headdb/util/Utils.java b/src/main/java/tsp/headdb/util/Utils.java index d40e375..cea3e34 100644 --- a/src/main/java/tsp/headdb/util/Utils.java +++ b/src/main/java/tsp/headdb/util/Utils.java @@ -1,12 +1,17 @@ package tsp.headdb.util; import org.bukkit.ChatColor; +import org.bukkit.Sound; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import tsp.headdb.HeadDB; import java.util.regex.Pattern; public class Utils { + private static final FileConfiguration config = HeadDB.getInstance().getConfig(); public static final Pattern UUID_PATTERN = Pattern.compile("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"); /** @@ -19,6 +24,18 @@ public class Utils { return UUID_PATTERN.matcher(uuid).matches(); } + public static void playSound(Player player, String key) { + // Check if sound is enabled + if (!config.getBoolean("ui.sound.enabled")) { + return; + } + + player.playSound(player.getLocation(), + Sound.valueOf(config.getString("ui.sound." + key + ".name")), + (float) config.getDouble("ui.sound." + key + ".volume"), + (float) config.getDouble("ui.sound." + key + ".pitch")); + } + public static void sendMessage(CommandSender sender, String message) { sender.sendMessage(colorize(message)); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f7095b8..7fde965 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -4,6 +4,10 @@ refresh: 3600 # If local heads should be enabled. Only starts keeping track of joined players when enabled! localHeads: true +# If enabled categories will require a permission to be used +# Permission: headdb.category. +requireCategoryPermission: false + # Economy options economy: enable: false @@ -67,6 +71,52 @@ ui: # Item used to fill unused slots in the categories menu. AIR is supported. You can use head: instead of item: here. fill: item: BLACK_STAINED_GLASS_PANE + sound: + # Whether the sounds should be played + enabled: true + + # Played when a head is taken with no economy plugin + noEconomy: + # The name of the sound. + # Must be one from: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html + name: ENTITY_EXPERIENCE_ORB_PICKUP + volume: 1 + pitch: 1 + # Played when the player doesn't have permission for the menu + noPermission: + name: BLOCK_ANVIL_BREAK + volume: 1 + pitch: 1 + # Played when they purchase a head + paid: + name: ENTITY_EXPERIENCE_ORB_PICKUP + volume: 1 + pitch: 1 + # Played when the head is free + free: + name: ENTITY_EXPERIENCE_ORB_PICKUP + volume: 1 + pitch: 1 + # Played when the player does not have enough funds for the head + unavailable: + name: BLOCK_ANVIL_BREAK + volume: 1 + pitch: 1 + # Played when a category/menu is opened + open: + name: ENTITY_EXPERIENCE_ORB_PICKUP + volume: 1 + pitch: 1 + # Played when a head is added to the favorites list + addFavorite: + name: ENTITY_EXPERIENCE_ORB_PICKUP + volume: 1 + pitch: 1 + # Played when a head is removed to from favorites list + removeFavorite: + name: BLOCK_ANVIL_BREAK + volume: 1 + pitch: 1 # Debug Mode -debug: false +debug: false \ No newline at end of file