diff --git a/src/main/java/de/epiceric/shopchest/ShopCommand.java b/src/main/java/de/epiceric/shopchest/ShopCommand.java index 139732d..eedb743 100644 --- a/src/main/java/de/epiceric/shopchest/ShopCommand.java +++ b/src/main/java/de/epiceric/shopchest/ShopCommand.java @@ -1,19 +1,34 @@ package de.epiceric.shopchest; import de.epiceric.shopchest.config.Placeholder; -import de.epiceric.shopchest.event.*; +import de.epiceric.shopchest.event.ShopPreCreateEvent; +import de.epiceric.shopchest.event.ShopPreInfoEvent; +import de.epiceric.shopchest.event.ShopPreOpenEvent; +import de.epiceric.shopchest.event.ShopPreRemoveEvent; +import de.epiceric.shopchest.event.ShopReloadEvent; +import de.epiceric.shopchest.event.ShopRemoveAllEvent; import de.epiceric.shopchest.language.LanguageUtils; import de.epiceric.shopchest.language.LocalizedMessage; import de.epiceric.shopchest.nms.JsonBuilder; import de.epiceric.shopchest.shop.Shop; import de.epiceric.shopchest.shop.Shop.ShopType; -import de.epiceric.shopchest.utils.*; +import de.epiceric.shopchest.utils.Callback; +import de.epiceric.shopchest.utils.ClickType; import de.epiceric.shopchest.utils.ClickType.EnumClickType; +import de.epiceric.shopchest.utils.ItemUtils; +import de.epiceric.shopchest.utils.Permissions; +import de.epiceric.shopchest.utils.ShopUtils; +import de.epiceric.shopchest.utils.UpdateChecker; import de.epiceric.shopchest.utils.UpdateChecker.UpdateCheckerResult; +import de.epiceric.shopchest.utils.Utils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; -import org.bukkit.command.*; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandMap; +import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginCommand; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -109,26 +124,21 @@ class ShopCommand implements CommandExecutor { Player p = (Player) sender; if (args[0].equalsIgnoreCase("create")) { - if (Utils.hasPermissionToCreateShop(p, Utils.getPreferredItemInHand(p))) { - if (args.length == 4) { + if (args.length == 4) { + needsHelp = false; + create(args, ShopType.NORMAL, p); + } else if (args.length == 5) { + if (args[4].equalsIgnoreCase("normal")) { needsHelp = false; create(args, ShopType.NORMAL, p); - } else if (args.length == 5) { - if (args[4].equalsIgnoreCase("normal")) { - needsHelp = false; - create(args, ShopType.NORMAL, p); - } else if (args[4].equalsIgnoreCase("admin")) { - needsHelp = false; - if (p.hasPermission(Permissions.CREATE_ADMIN)) { - create(args, ShopType.ADMIN, p); - } else { - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_CREATE_ADMIN)); - } + } else if (args[4].equalsIgnoreCase("admin")) { + needsHelp = false; + if (p.hasPermission(Permissions.CREATE_ADMIN)) { + create(args, ShopType.ADMIN, p); + } else { + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_CREATE_ADMIN)); } } - } else { - needsHelp = false; - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_CREATE)); } } else if (args[0].equalsIgnoreCase("remove")) { needsHelp = false; @@ -286,6 +296,23 @@ class ShopCommand implements CommandExecutor { int amount; double buyPrice, sellPrice; + // Check if amount and prices are valid + try { + amount = Integer.parseInt(args[1]); + buyPrice = Double.parseDouble(args[2]); + sellPrice = Double.parseDouble(args[3]); + } catch (NumberFormatException e) { + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.AMOUNT_PRICE_NOT_NUMBER)); + plugin.debug(p.getName() + " has entered an invalid amount and/or prices"); + return; + } + + if (!Utils.hasPermissionToCreateShop(p, Utils.getPreferredItemInHand(p), buyPrice > 0, sellPrice > 0)) { + p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.NO_PERMISSION_CREATE)); + plugin.debug(p.getName() + " is not permitted to create the shop"); + return; + } + // Check for limits int limit = shopUtils.getShopLimit(p); if (limit != -1) { @@ -298,17 +325,6 @@ class ShopCommand implements CommandExecutor { } } - // Check if amount and prices are valid - try { - amount = Integer.parseInt(args[1]); - buyPrice = Double.parseDouble(args[2]); - sellPrice = Double.parseDouble(args[3]); - } catch (NumberFormatException e) { - p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.AMOUNT_PRICE_NOT_NUMBER)); - plugin.debug(p.getName() + " has entered an invalid amount"); - return; - } - if (amount <= 0) { p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.AMOUNT_IS_ZERO)); plugin.debug(p.getName() + " has entered an invalid amount"); diff --git a/src/main/java/de/epiceric/shopchest/utils/Permissions.java b/src/main/java/de/epiceric/shopchest/utils/Permissions.java index ba1fa20..de95347 100644 --- a/src/main/java/de/epiceric/shopchest/utils/Permissions.java +++ b/src/main/java/de/epiceric/shopchest/utils/Permissions.java @@ -3,6 +3,8 @@ package de.epiceric.shopchest.utils; public class Permissions { public static final String CREATE = "shopchest.create"; + public static final String CREATE_BUY = "shopchest.create.buy"; + public static final String CREATE_SELL = "shopchest.create.sell"; public static final String CREATE_ADMIN = "shopchest.create.admin"; public static final String CREATE_PROTECTED = "shopchest.create.protected"; public static final String REMOVE_OTHER = "shopchest.remove.other"; diff --git a/src/main/java/de/epiceric/shopchest/utils/Utils.java b/src/main/java/de/epiceric/shopchest/utils/Utils.java index aba1f9f..3f44205 100644 --- a/src/main/java/de/epiceric/shopchest/utils/Utils.java +++ b/src/main/java/de/epiceric/shopchest/utils/Utils.java @@ -258,31 +258,58 @@ public class Utils { } /** - *

Check if a player is allowed to create a shop that sells (or buys) the given item.

- * The player is allowed to create the shop if has either the permission {@code shopchest.create}, - * {@code shopchest.create.[ITEM]} or {@code shopchest.create.[ITEM].[DURABILITY]} + *

Check if a player is allowed to create a shop that sells or buys the given item.

* @param player Player to check * @param item Item to be sold or bought + * @param buy Whether buying should be enabled + * @param sell Whether selling should be enabled * @return Whether the player is allowed */ - public static boolean hasPermissionToCreateShop(Player player, ItemStack item) { - if (player.hasPermission(Permissions.CREATE)) { + public static boolean hasPermissionToCreateShop(Player player, ItemStack item, boolean buy, boolean sell) { + if (hasPermissionToCreateShop(player, item, Permissions.CREATE)) { + return true; + } else if (!sell && buy && hasPermissionToCreateShop(player, item,Permissions.CREATE_BUY)) { + return true; + } else if (!buy && sell && hasPermissionToCreateShop(player, item, Permissions.CREATE_SELL)) { + return true; + } else if (buy && sell && hasPermissionToCreateShop(player, item, Permissions.CREATE_BUY, Permissions.CREATE_SELL)) { return true; } - if (item != null) { - if (item.getDurability() == 0) { - if (player.hasPermission(Permissions.CREATE + "." + item.getType().toString())) { - return true; + return false; + } + + private static boolean hasPermissionToCreateShop(Player player, ItemStack item, String... permissions) { + for (String permission : permissions) { + boolean b1 = false; + boolean b2 = false; + boolean b3 = false; + + if (player.hasPermission(permission)) { + b1 = true; + } + + if (item != null) { + if (item.getDurability() == 0) { + String perm1 = permission + "." + item.getType().toString(); + String perm2 = permission + "." + item.getType().toString() + ".0"; + + if (player.hasPermission(perm1) || player.hasPermission(perm2)) { + b2 = true; + } + } + + if (player.hasPermission(permission + "." + item.getType().toString() + "." + item.getDurability())) { + b3 = true; } } - if (player.hasPermission(Permissions.CREATE + "." + item.getType().toString() + "." + item.getDurability())) { - return true; + if (!(b1 || b2 || b3)) { + return false; } } - return false; + return true; } /** diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4bec7f5..626e294 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -14,6 +14,8 @@ permissions: description: Gives access to all ShopChest permissions. children: shopchest.create: true + shopchest.create.buy: true + shopchest.create.sell: true shopchest.create.admin: true shopchest.create.protected: true shopchest.remove.other: true @@ -30,6 +32,15 @@ permissions: shopchest.external.bypass: true shopchest.create: description: Allows you to create a shop. + children: + shopchest.create.buy: true + shopchest.create.sell: true + default: true + shopchest.create.buy: + description: Allows you to create a buy-shop. + default: true + shopchest.create.sell: + description: Allows you to create a sell-shop. default: true shopchest.create.admin: description: Allows you to create an admin shop.