diff --git a/src/main/java/com/Acrobot/ChestShop/Commands/AddAccessor.java b/src/main/java/com/Acrobot/ChestShop/Commands/AddAccessor.java index f765dfe54..8783b03b6 100644 --- a/src/main/java/com/Acrobot/ChestShop/Commands/AddAccessor.java +++ b/src/main/java/com/Acrobot/ChestShop/Commands/AddAccessor.java @@ -43,7 +43,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (result != null) { signBlock = result.getHitBlock(); } - if (signBlock == null || !ChestShopSign.isValid(signBlock)) { + if (signBlock == null || !ChestShopSign.isLegacyValid(signBlock)) { sender.sendMessage(Messages.MUST_LOOK_AT_SHOP_SIGN); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Commands/RemoveAccessor.java b/src/main/java/com/Acrobot/ChestShop/Commands/RemoveAccessor.java index 0188b7a65..f0e103f95 100644 --- a/src/main/java/com/Acrobot/ChestShop/Commands/RemoveAccessor.java +++ b/src/main/java/com/Acrobot/ChestShop/Commands/RemoveAccessor.java @@ -43,7 +43,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (result != null) { signBlock = result.getHitBlock(); } - if (signBlock == null || !ChestShopSign.isValid(signBlock)) { + if (signBlock == null || !ChestShopSign.isLegacyValid(signBlock)) { sender.sendMessage(Messages.MUST_LOOK_AT_SHOP_SIGN); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Commands/SetAmount.java b/src/main/java/com/Acrobot/ChestShop/Commands/SetAmount.java index 8f8c50a79..8a4dfbb6d 100644 --- a/src/main/java/com/Acrobot/ChestShop/Commands/SetAmount.java +++ b/src/main/java/com/Acrobot/ChestShop/Commands/SetAmount.java @@ -1,11 +1,7 @@ package com.Acrobot.ChestShop.Commands; -import com.Acrobot.ChestShop.Configuration.Messages; -import com.Acrobot.ChestShop.Signs.ChestShopSign; import static com.Acrobot.ChestShop.Permission.ADMIN; -import com.Acrobot.ChestShop.ChestShop; -import com.Acrobot.ChestShop.Permission; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.Command; @@ -15,6 +11,11 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.util.RayTraceResult; +import com.Acrobot.ChestShop.ChestShop; +import com.Acrobot.ChestShop.Permission; +import com.Acrobot.ChestShop.Configuration.Messages; +import com.Acrobot.ChestShop.Signs.ChestShopSign; + public class SetAmount implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -33,7 +34,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (result != null) { signBlock = result.getHitBlock(); } - if (signBlock == null || !ChestShopSign.isValid(signBlock)) { + if (signBlock == null || !ChestShopSign.isLegacyValid(signBlock)) { sender.sendMessage(Messages.MUST_LOOK_AT_SHOP_SIGN); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Commands/SetItem.java b/src/main/java/com/Acrobot/ChestShop/Commands/SetItem.java index 85f0d9347..fdbc1f91f 100644 --- a/src/main/java/com/Acrobot/ChestShop/Commands/SetItem.java +++ b/src/main/java/com/Acrobot/ChestShop/Commands/SetItem.java @@ -1,10 +1,7 @@ package com.Acrobot.ChestShop.Commands; -import com.Acrobot.ChestShop.Configuration.Messages; -import com.Acrobot.ChestShop.Signs.ChestShopSign; import static com.Acrobot.ChestShop.Permission.ADMIN; -import com.Acrobot.ChestShop.ChestShop; -import com.Acrobot.ChestShop.Permission; + import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.Command; @@ -14,6 +11,11 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.util.RayTraceResult; +import com.Acrobot.ChestShop.ChestShop; +import com.Acrobot.ChestShop.Permission; +import com.Acrobot.ChestShop.Configuration.Messages; +import com.Acrobot.ChestShop.Signs.ChestShopSign; + public class SetItem implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -32,7 +34,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (result != null) { signBlock = result.getHitBlock(); } - if (signBlock == null || !ChestShopSign.isValid(signBlock)) { + if (signBlock == null || !ChestShopSign.isLegacyValid(signBlock)) { sender.sendMessage(Messages.MUST_LOOK_AT_SHOP_SIGN); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Commands/SetPrice.java b/src/main/java/com/Acrobot/ChestShop/Commands/SetPrice.java index aa680dd0a..c436a2e34 100644 --- a/src/main/java/com/Acrobot/ChestShop/Commands/SetPrice.java +++ b/src/main/java/com/Acrobot/ChestShop/Commands/SetPrice.java @@ -1,11 +1,7 @@ package com.Acrobot.ChestShop.Commands; -import com.Acrobot.ChestShop.Configuration.Messages; -import com.Acrobot.ChestShop.Signs.ChestShopSign; import static com.Acrobot.ChestShop.Permission.ADMIN; -import com.Acrobot.ChestShop.ChestShop; -import com.Acrobot.ChestShop.Permission; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.Command; @@ -15,6 +11,11 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.util.RayTraceResult; +import com.Acrobot.ChestShop.ChestShop; +import com.Acrobot.ChestShop.Permission; +import com.Acrobot.ChestShop.Configuration.Messages; +import com.Acrobot.ChestShop.Signs.ChestShopSign; + public class SetPrice implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -33,7 +34,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (result != null) { signBlock = result.getHitBlock(); } - if (signBlock == null || !ChestShopSign.isValid(signBlock)) { + if (signBlock == null || !ChestShopSign.isLegacyValid(signBlock)) { sender.sendMessage(Messages.MUST_LOOK_AT_SHOP_SIGN); return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/BlockPlace.java b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/BlockPlace.java index 49b52b46e..29d73c2b5 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/BlockPlace.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/BlockPlace.java @@ -53,7 +53,7 @@ public static void onChestPlace(BlockPlaceEvent event) { public static void onPlaceAgainstSign(BlockPlaceEvent event) { Block against = event.getBlockAgainst(); - if (!ChestShopSign.isValid(against)) { + if (!ChestShopSign.isLegacyValid(against)) { return; } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/Break/SignBreak.java b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/Break/SignBreak.java index 170e67be7..64628c33a 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/Break/SignBreak.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/Break/SignBreak.java @@ -52,7 +52,7 @@ public static void onSign(BlockPhysicsEvent event) { Sign sign = (Sign) block.getState(); Block attachedBlock = BlockUtil.getAttachedBlock(sign); - if (attachedBlock.getType() == Material.AIR && ChestShopSign.isValid(sign)) { + if (attachedBlock.getType() == Material.AIR && ChestShopSign.isLegacyValid(sign)) { if (!block.hasMetadata(METADATA_NAME)) { return; } @@ -70,7 +70,7 @@ public static void onSignBreak(BlockBreakEvent event) { @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) public static void onBrokenSign(BlockBreakEvent event) { - if (ChestShopSign.isValid(event.getBlock())) { + if (ChestShopSign.isLegacyValid(event.getBlock())) { sendShopDestroyedEvent((Sign) event.getBlock().getState(), event.getPlayer()); } } @@ -124,7 +124,7 @@ public static boolean canBlockBeBroken(Block block, Player breaker) { for (Sign sign : attachedSigns) { - if (!canBeBroken || !ChestShopSign.isValid(sign)) { + if (!canBeBroken || !ChestShopSign.isLegacyValid(sign)) { continue; } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/SignCreate.java b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/SignCreate.java index 448eeec8d..f790eaeef 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Block/SignCreate.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Block/SignCreate.java @@ -25,7 +25,7 @@ public class SignCreate implements Listener { public static void onSignChange(SignChangeEvent event) { Block signBlock = event.getBlock(); if (event.getSide() == Side.BACK) { - if (ChestShopSign.isValid(signBlock)) { + if (ChestShopSign.isLegacyValid(signBlock)) { event.setCancelled(true); } return; diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java index 2e8af12d2..156d1408b 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java @@ -84,7 +84,7 @@ public static void onInteract(PlayerInteractEvent event) { Sign sign = (Sign) block.getState(); - if (!ChestShopSign.isValid(sign)) { + if (!ChestShopSign.isLegacyValid(sign)) { return; } diff --git a/src/main/java/com/Acrobot/ChestShop/Plugins/ChestShop.java b/src/main/java/com/Acrobot/ChestShop/Plugins/ChestShop.java index d7ab55c0e..46a842826 100644 --- a/src/main/java/com/Acrobot/ChestShop/Plugins/ChestShop.java +++ b/src/main/java/com/Acrobot/ChestShop/Plugins/ChestShop.java @@ -41,7 +41,7 @@ public static boolean canAccess(Player player, Block block) { if (isSign(block)) { Sign sign = (Sign) block.getState(); - if (!ChestShopSign.isValid(sign)) { + if (!ChestShopSign.isLegacyValid(sign)) { return true; } diff --git a/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopMetaData.java b/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopMetaData.java new file mode 100644 index 000000000..1e1695056 --- /dev/null +++ b/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopMetaData.java @@ -0,0 +1,100 @@ +package com.Acrobot.ChestShop.Signs; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.bukkit.inventory.ItemStack; + +public class ChestShopMetaData implements ConfigurationSerializable { + + private UUID owner; + private Set accessors; + + private int quantity; + + private double buyPrice; + + private double sellPrice; + + private ItemStack itemStack; + + public ChestShopMetaData(UUID owner, int quantity, double sellPrice, double buyPrice, ItemStack itemStack) { + this(owner, quantity, sellPrice, buyPrice, itemStack, new HashSet<>()); + } + + private ChestShopMetaData(UUID owner, int quantity, double sellPrice, double buyPrice, ItemStack itemStack, Set accessors) { + this.owner = owner; + this.quantity = quantity; + this.sellPrice = sellPrice; + this.buyPrice = buyPrice; + this.itemStack = itemStack; + this.accessors = accessors; + } + + public HashSet getAccessors() { + return new HashSet<>(accessors); + } + + public void addAccessor(UUID uuid) { + accessors.add(uuid); + } + + public void removeAccessor(UUID uuid) { + accessors.remove(uuid); + } + + public boolean isAccessor(UUID uuid) { + return accessors.contains(uuid); + } + + public UUID getOwner() { + return owner; + } + + public boolean isOwner(UUID uuid) { + return owner.equals(uuid); + } + + public int getQuantity() { + return quantity; + } + + public double getBuyPrice() { + return buyPrice; + } + + public double getSellPrice() { + return sellPrice; + } + + public ItemStack getItemStack() { + return itemStack; + } + + @Override + public Map serialize() { + Map data = new HashMap<>(); + data.put("owner", owner); + data.put("accessors", accessors); + data.put("amount", quantity); + data.put("buyPrice", buyPrice); + data.put("sellPrice", sellPrice); + data.put("itemStack", itemStack.serialize()); + return data; + } + + public static ChestShopMetaData deserialize(Map map) { + + UUID owner = (UUID) map.get("owner"); + int amount = (int) map.get("amount"); + double sellPrice = (double) map.get("sellPrice"); + double buyPrice = (double) map.get("buyPrice"); + ItemStack itemStack = (ItemStack) map.get("itemStack"); + Set accessors = new HashSet<>((HashSet) map.get("accessors")); + return new ChestShopMetaData(owner, amount, sellPrice, buyPrice, itemStack, accessors); + } +} diff --git a/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopSign.java b/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopSign.java index 07baaa234..2016079fb 100644 --- a/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopSign.java +++ b/src/main/java/com/Acrobot/ChestShop/Signs/ChestShopSign.java @@ -1,93 +1,48 @@ package com.Acrobot.ChestShop.Signs; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.UUID; -import java.util.regex.Pattern; +import java.util.logging.Level; +import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; -import org.bukkit.block.Block; -import org.bukkit.block.BlockState; -import org.bukkit.block.Container; -import org.bukkit.block.ShulkerBox; import org.bukkit.block.Sign; -import org.bukkit.inventory.Inventory; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BlockStateMeta; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -import com.Acrobot.Breeze.Utils.BlockUtil; -import com.Acrobot.Breeze.Utils.MaterialUtil; import com.Acrobot.ChestShop.ChestShop; -import com.Acrobot.ChestShop.Configuration.Properties; -import com.Acrobot.ChestShop.Containers.AdminInventory; import com.Acrobot.ChestShop.UUIDs.NameManager; -import com.Acrobot.ChestShop.Utils.uBlock; /** * @author Acrobot */ public class ChestShopSign { - private static final byte NAME_LINE = 0; - public static final byte QUANTITY_LINE = 1; - public static final byte PRICE_LINE = 2; - public static final byte ITEM_LINE = 3; - - public static final Pattern[] SHOP_SIGN_PATTERN = { Pattern.compile("^?[\\w -.]*$"), Pattern.compile("^[1-9][0-9]{0,4}$"), Pattern.compile("(?i)^[\\d.bs(free) :]+$"), Pattern.compile("^[\\w? #:-]+$") }; public static final String AUTOFILL_CODE = "?"; public static final String AUTOFILL_SHULKER_CONTENT_CODE = "??"; - private static NamespacedKey OWNER_NAMESPACED_KEY; - private static NamespacedKey ADMINSHOP_NAMESPACED_KEY; - private static NamespacedKey ACCESSORS_NAMESPACED_KEY; + private static NamespacedKey METADATA_NAMESPACED_KEY; public static void createNamespacedKeys(ChestShop chestShop) { - - OWNER_NAMESPACED_KEY = new NamespacedKey(chestShop, "owner-key"); - ADMINSHOP_NAMESPACED_KEY = new NamespacedKey(chestShop, "adminshop-key"); - ACCESSORS_NAMESPACED_KEY = new NamespacedKey(chestShop, "accessors-key"); - } - - public static boolean isAdminShop(Inventory ownerInventory) { - return ownerInventory instanceof AdminInventory; + METADATA_NAMESPACED_KEY = new NamespacedKey(chestShop, "metadata"); } - public static boolean isAdminShopNameString(String string) { - return string.replace(" ", "").equalsIgnoreCase(Properties.ADMIN_SHOP_NAME.replace(" ", "")); - } - - public static void setAdminshop(boolean isAdminshop, Sign sign) { - sign.getPersistentDataContainer().set(ADMINSHOP_NAMESPACED_KEY, PersistentDataType.BOOLEAN, Boolean.valueOf(isAdminshop)); - sign.update(true); - } - - public static boolean isAdminShop(Sign sign) { - - PersistentDataContainer persistentDataContainer = sign.getPersistentDataContainer(); - if (!persistentDataContainer.has(ADMINSHOP_NAMESPACED_KEY, PersistentDataType.BOOLEAN)) { - - boolean isAdminshop = isAdminShopNameString(sign.getLine(NAME_LINE)); - setAdminshop(isAdminshop, sign); - return isAdminshop; - } + public static void createChestShop(Sign sign, Player owner, int quantity, double sellPrice, double buyPrice, ItemStack itemStack) { - return persistentDataContainer.get(ADMINSHOP_NAMESPACED_KEY, PersistentDataType.BOOLEAN).booleanValue(); + ChestShopMetaData chestShopMetaData = new ChestShopMetaData(owner.getUniqueId(), quantity, sellPrice, buyPrice, itemStack); + saveChestShopMetaData(sign, chestShopMetaData); } - public static boolean isValid(Sign sign) { - return isValid(sign.getLines()); - } + public static void createAdminChestShop(Sign sign, int quantity, double sellPrice, double buyPrice, ItemStack itemStack) { - public static boolean isValid(String[] line) { - return isValidPreparedSign(line) && (line[PRICE_LINE].toUpperCase().contains("B") || line[PRICE_LINE].toUpperCase().contains("S")) && !line[NAME_LINE].isEmpty(); + ChestShopMetaData chestShopMetaData = new ChestShopMetaData(NameManager.getAdminShopUUID(), quantity, sellPrice, buyPrice, + itemStack); + saveChestShopMetaData(sign, chestShopMetaData); } - public static boolean isValid(Block sign) { - return BlockUtil.isSign(sign) && isValid((Sign) sign.getState()); + public static boolean isAdminShop(Sign sign) { } public static boolean canAccess(OfflinePlayer player, Sign sign) { @@ -105,171 +60,89 @@ public static boolean canAccess(OfflinePlayer player, Sign sign) { } public static boolean isOwner(OfflinePlayer player, Sign sign) { - PersistentDataContainer persistentDataContainer = sign.getPersistentDataContainer(); - String playerUUIDAsString = player.getUniqueId().toString(); - - if (isAdminShop(sign)) { - return false; - } - - if (!persistentDataContainer.has(OWNER_NAMESPACED_KEY, PersistentDataType.STRING)) { + } - // Update old Signs - String ownerName = sign.getLine(NAME_LINE); - UUID uuidByName = NameManager.getUUIDFor(ownerName); - setOwner(uuidByName, sign); + public static UUID getOwner(Sign sign) { + } - if (!NameManager.canUseName(player, ownerName)) { - return false; // Player isn't Owner - } - } + public static boolean isAccessor(OfflinePlayer player, Sign sign) { + } - String owner = getOwner(sign); - return playerUUIDAsString.equals(owner); + public static void addAccessor(UUID player, Sign sign) { } - public static void setOwner(UUID player, Sign sign) { - sign.getPersistentDataContainer().set(OWNER_NAMESPACED_KEY, PersistentDataType.STRING, player.toString()); - sign.update(true); + public static boolean isAccessor(UUID player, Sign sign) { } - private static String getOwner(Sign sign) { - return sign.getPersistentDataContainer().get(OWNER_NAMESPACED_KEY, PersistentDataType.STRING); + public static void removeAccessor(UUID player, Sign sign) { } - public static UUID getOwnerUUID(Sign sign) { + private static void updateLegacyChestShop(Sign sign) { - if (isAdminShop(sign)) { - return NameManager.getAdminShopUUID(); - } + UUID ownerUUID = LegacyChestShopSign.getOwnerUUID(sign); - String owner = getOwner(sign); - if (owner == null) - return null; + int quantity = LegacyChestShopSign.getQuantity(sign); + double buyPrice = LegacyChestShopSign.getBuyPrice(sign); + double sellPrice = LegacyChestShopSign.getSellPrice(sign); - return UUID.fromString(owner); - } + ItemStack itemStack = LegacyChestShopSign.getItemStack(sign); - public static boolean isAccessor(OfflinePlayer player, Sign sign) { + ChestShopMetaData chestShopMetaData = new ChestShopMetaData(ownerUUID, quantity, sellPrice, buyPrice, itemStack); + PersistentDataContainer persistentDataContainer = sign.getPersistentDataContainer(); - Collection accessors = getAccessors(sign); - return accessors.contains(player.getUniqueId().toString()); + YamlConfiguration yamlConfiguration = new YamlConfiguration(); + yamlConfiguration.set("metadata", chestShopMetaData); + + persistentDataContainer.set(METADATA_NAMESPACED_KEY, PersistentDataType.STRING, yamlConfiguration.saveToString()); } - public static Collection getAccessors(Sign sign) { + private static boolean isLegacyChestShop(Sign sign) { - PersistentDataContainer persistentDataContainer = sign.getPersistentDataContainer(); - if (!persistentDataContainer.has(ACCESSORS_NAMESPACED_KEY, PersistentDataType.STRING)) - return new HashSet<>(); + if (!sign.getPersistentDataContainer().has(METADATA_NAMESPACED_KEY, PersistentDataType.STRING)) + return false; - String data = persistentDataContainer.get(ACCESSORS_NAMESPACED_KEY, PersistentDataType.STRING); - if (data.isEmpty()) - return new HashSet<>(); + return LegacyChestShopSign.isValid(sign); + } - String[] split = data.split(";"); + public static boolean isChestShop(Sign sign) { - return new HashSet<>(Arrays.asList(split)); - } + if (isLegacyChestShop(sign)) { + updateLegacyChestShop(sign); + return true; + } - public static void addAccessor(UUID player, Sign sign) { - Collection accessors = getAccessors(sign); - accessors.add(player.toString()); - saveAccessors(accessors, sign); + return sign.getPersistentDataContainer().has(METADATA_NAMESPACED_KEY, PersistentDataType.STRING); } - public static boolean isAccessor(UUID player, Sign sign) { - Collection accessors = getAccessors(sign); - return accessors.contains(player.toString()); - } + private static ChestShopMetaData getChestShopMetaData(Sign sign) { - public static void removeAccessor(UUID player, Sign sign) { - Collection accessors = getAccessors(sign); - accessors.remove(player.toString()); - saveAccessors(accessors, sign); - } + try { - private static void saveAccessors(Collection accessors, Sign sign) { - String joined = String.join(";", accessors); - sign.getPersistentDataContainer().set(ACCESSORS_NAMESPACED_KEY, PersistentDataType.STRING, joined); - sign.update(true); - } + String string = sign.getPersistentDataContainer().get(METADATA_NAMESPACED_KEY, PersistentDataType.STRING); + YamlConfiguration yamlConfiguration = new YamlConfiguration(); + yamlConfiguration.loadFromString(string); + return (ChestShopMetaData) yamlConfiguration.get("metadata"); - public static boolean isValidPreparedSign(String[] lines) { - for (int i = 0; i < 4; i++) { - if (!SHOP_SIGN_PATTERN[i].matcher(lines[i]).matches()) { - return false; - } + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, + "Exception loading Chestshop Metadata (" + sign.getX() + " " + sign.getY() + " " + sign.getZ() + ").", e); + return null; } - return lines[PRICE_LINE].indexOf(':') == lines[PRICE_LINE].lastIndexOf(':'); } - /** - * Returns the itemCode as it should display on a sign or null, if the itemCode is invalid. - * - * @param itemCode - * the user entered itemCode - * @param sign - * the sign to set the item, required for autofill - * @return the corrected itemCode or null if it was invalid - */ - public static String getCorrectedItemCode(String itemCode, Sign sign) { - ItemStack item = MaterialUtil.getItem(itemCode); - if (item == null) { - if (Properties.ALLOW_AUTO_ITEM_FILL && (itemCode.equals(AUTOFILL_CODE) || itemCode.equals(AUTOFILL_SHULKER_CONTENT_CODE))) { - Container connectedChest = uBlock.findConnectedChest(sign, true); - if (connectedChest != null) { - if (itemCode.equals(AUTOFILL_SHULKER_CONTENT_CODE)) { - out: for (ItemStack stack : connectedChest.getInventory().getContents()) { - if (!MaterialUtil.isEmpty(stack) && BlockUtil.isShulkerBox(stack.getType())) { - ItemMeta meta = stack.getItemMeta(); - if (meta instanceof BlockStateMeta) { - BlockStateMeta bsm = (BlockStateMeta) meta; - BlockState blockState = bsm.getBlockState(); - if (blockState instanceof ShulkerBox) { - ShulkerBox shulkerBox = (ShulkerBox) blockState; - for (ItemStack shulkerContent : shulkerBox.getSnapshotInventory().getStorageContents()) { - if (!MaterialUtil.isEmpty(shulkerContent)) { - item = shulkerContent; - itemCode = MaterialUtil.getSignName(shulkerContent); - if (itemCode == null) { - item = null; - } - break out; - } - } - } - } - } - } - } else { - for (ItemStack stack : connectedChest.getInventory().getContents()) { - if (!MaterialUtil.isEmpty(stack)) { - item = stack; - itemCode = MaterialUtil.getSignName(stack); - if (itemCode == null) { - item = null; - } - break; - } - } - } - } - } - - if (item == null) { - return null; - } - } + private static void saveChestShopMetaData(Sign sign, ChestShopMetaData chestShopMetaData) { - String metaCode = MaterialUtil.Metadata.getMetaCodeFromItemCode(itemCode); - metaCode = metaCode == null ? "" : "#" + metaCode; - String itemName = MaterialUtil.getSignMaterialName(item.getType(), metaCode); + try { - ItemStack newItem = MaterialUtil.getItem(itemCode); - if (newItem == null || !newItem.isSimilar(item)) { - return null; - } + YamlConfiguration yamlConfiguration = new YamlConfiguration(); + yamlConfiguration.set("metadata", chestShopMetaData); + + String string = yamlConfiguration.saveToString(); + sign.getPersistentDataContainer().set(METADATA_NAMESPACED_KEY, PersistentDataType.STRING, string); - return itemName + metaCode; + } catch (Exception e) { + Bukkit.getLogger().log(Level.WARNING, + "Exception saving Chestshop Metadata (" + sign.getX() + " " + sign.getY() + " " + sign.getZ() + ").", e); + } } } diff --git a/src/main/java/com/Acrobot/ChestShop/Signs/LegacyChestShopSign.java b/src/main/java/com/Acrobot/ChestShop/Signs/LegacyChestShopSign.java new file mode 100644 index 000000000..96fdd046d --- /dev/null +++ b/src/main/java/com/Acrobot/ChestShop/Signs/LegacyChestShopSign.java @@ -0,0 +1,85 @@ +package com.Acrobot.ChestShop.Signs; + +import java.util.UUID; +import java.util.regex.Pattern; + +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import com.Acrobot.Breeze.Utils.BlockUtil; +import com.Acrobot.Breeze.Utils.MaterialUtil; +import com.Acrobot.Breeze.Utils.PriceUtil; +import com.Acrobot.ChestShop.Configuration.Properties; +import com.Acrobot.ChestShop.Containers.AdminInventory; +import com.Acrobot.ChestShop.UUIDs.NameManager; + +class LegacyChestShopSign { + public static final byte NAME_LINE = 0; + public static final byte QUANTITY_LINE = 1; + public static final byte PRICE_LINE = 2; + public static final byte ITEM_LINE = 3; + + public static final Pattern[] SHOP_SIGN_PATTERN = { Pattern.compile("^?[\\w -.]*$"), Pattern.compile("^[1-9][0-9]{0,4}$"), + Pattern.compile("(?i)^[\\d.bs(free) :]+$"), Pattern.compile("^[\\w? #:-]+$") }; + + public static boolean isAdminShop(Inventory ownerInventory) { + return ownerInventory instanceof AdminInventory; + } + + public static boolean isAdminShop(String owner) { + return owner.replace(" ", "").equalsIgnoreCase(Properties.ADMIN_SHOP_NAME.replace(" ", "")); + } + + public static ItemStack getItemStack(Sign sign) { + return MaterialUtil.getItem(sign.getLine(ITEM_LINE)); + } + + public static double getBuyPrice(Sign sign) { + return PriceUtil.getBuyPrice(sign.getLine(PRICE_LINE)); + } + + public static double getSellPrice(Sign sign) { + return PriceUtil.getSellPrice(sign.getLine(PRICE_LINE)); + } + + public static int getQuantity(Sign sign) { + String line = sign.getLine(QUANTITY_LINE); + return Integer.parseInt(line.replaceAll("[^0-9]", "")); + } + + public static boolean isAdminShop(Sign sign) { + return isAdminShop(sign.getLine(NAME_LINE)); + } + + public static boolean isValid(Sign sign) { + return isValid(sign.getLines()); + } + + public static boolean isValid(String[] line) { + return isValidPreparedSign(line) && (line[PRICE_LINE].toUpperCase().contains("B") || line[PRICE_LINE].toUpperCase().contains("S")) + && !line[NAME_LINE].isEmpty(); + } + + public static boolean isValid(Block sign) { + return BlockUtil.isSign(sign) && isValid((Sign) sign.getState()); + } + + public static UUID getOwnerUUID(Sign sign) { + + if (isAdminShop(sign)) + return NameManager.getAdminShopUUID(); + + return NameManager.getUUIDFor(sign.getLine(NAME_LINE)); + } + + public static boolean isValidPreparedSign(String[] lines) { + for (int i = 0; i < 4; i++) { + if (!SHOP_SIGN_PATTERN[i].matcher(lines[i]).matches()) { + return false; + } + } + return lines[PRICE_LINE].indexOf(':') == lines[PRICE_LINE].lastIndexOf(':'); + } +} diff --git a/src/main/java/com/Acrobot/ChestShop/Signs/RestrictedSign.java b/src/main/java/com/Acrobot/ChestShop/Signs/RestrictedSign.java index 4a8c6489f..2958ecc16 100644 --- a/src/main/java/com/Acrobot/ChestShop/Signs/RestrictedSign.java +++ b/src/main/java/com/Acrobot/ChestShop/Signs/RestrictedSign.java @@ -1,9 +1,8 @@ package com.Acrobot.ChestShop.Signs; -import com.Acrobot.Breeze.Utils.BlockUtil; -import com.Acrobot.ChestShop.Configuration.Messages; -import com.Acrobot.ChestShop.Events.PreTransactionEvent; -import com.Acrobot.ChestShop.Permission; +import static com.Acrobot.ChestShop.Events.PreTransactionEvent.TransactionOutcome.SHOP_IS_RESTRICTED; +import static com.Acrobot.ChestShop.Permission.ADMIN; + import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -15,8 +14,10 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.SignChangeEvent; -import static com.Acrobot.ChestShop.Events.PreTransactionEvent.TransactionOutcome.SHOP_IS_RESTRICTED; -import static com.Acrobot.ChestShop.Permission.ADMIN; +import com.Acrobot.Breeze.Utils.BlockUtil; +import com.Acrobot.ChestShop.Permission; +import com.Acrobot.ChestShop.Configuration.Messages; +import com.Acrobot.ChestShop.Events.PreTransactionEvent; /** * @author Acrobot @@ -51,7 +52,7 @@ public static void onSignChange(SignChangeEvent event) { } Block connectedSign = event.getBlock().getRelative(BlockFace.DOWN); - if (!Permission.has(player, ADMIN) || !ChestShopSign.isValid(connectedSign)) { + if (!Permission.has(player, ADMIN) || !ChestShopSign.isLegacyValid(connectedSign)) { dropSignAndCancelEvent(event); return; } diff --git a/src/main/java/com/Acrobot/ChestShop/Utils/uBlock.java b/src/main/java/com/Acrobot/ChestShop/Utils/uBlock.java index 9fc19b658..885fcce30 100644 --- a/src/main/java/com/Acrobot/ChestShop/Utils/uBlock.java +++ b/src/main/java/com/Acrobot/ChestShop/Utils/uBlock.java @@ -1,7 +1,5 @@ package com.Acrobot.ChestShop.Utils; -import com.Acrobot.Breeze.Utils.BlockUtil; -import com.Acrobot.ChestShop.Signs.ChestShopSign; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; @@ -17,6 +15,9 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import com.Acrobot.Breeze.Utils.BlockUtil; +import com.Acrobot.ChestShop.Signs.ChestShopSign; + /** * @author Acrobot */ @@ -164,7 +165,7 @@ private static Sign findAnyNearbyShopSign(Block block, Block ignoredSign) { } Sign sign = (Sign) faceBlock.getState(); - if (ChestShopSign.isValid(sign)) { + if (ChestShopSign.isLegacyValid(sign)) { Block attachedTo = findConnectedChestBlock(sign); if (attachedTo != null && attachedTo.equals(block)) { return sign;