From 515613c36daa411d1c485d235a90faf32f0c1c22 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Fri, 11 Nov 2022 04:21:15 +0100 Subject: [PATCH] Added check stock command --- .../commands/CheckStockCommand.java | 94 +++++++++++++++++++ .../playershops/commands/ShopCommand.java | 12 ++- .../playershops/handler/ShopHandler.java | 19 ++++ 3 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/alttd/playershops/commands/CheckStockCommand.java diff --git a/src/main/java/com/alttd/playershops/commands/CheckStockCommand.java b/src/main/java/com/alttd/playershops/commands/CheckStockCommand.java new file mode 100644 index 0000000..0dfb330 --- /dev/null +++ b/src/main/java/com/alttd/playershops/commands/CheckStockCommand.java @@ -0,0 +1,94 @@ +package com.alttd.playershops.commands; + +import com.alttd.playershops.PlayerShops; +import com.alttd.playershops.shop.PlayerShop; +import com.alttd.playershops.utils.ShopUtil; +import com.alttd.playershops.utils.Util; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.stream.Collectors; + +public class CheckStockCommand { + private int playerX; + private int playerZ; + private int radius; + private int minimumStock = -1; + private final PlayerShops plugin; + public CheckStockCommand(PlayerShops plugin, Player player, String[] args) { + this.plugin = plugin; + if (args.length != 2 && args.length != 3) { + player.sendMessage(Util.parseMiniMessage("Invalid command syntax, use /checkstock [minimum stock]")); + return; + } + + try { + radius = Integer.parseInt(args[1]); + } catch (NumberFormatException e) { + player.sendMessage(Util.parseMiniMessage("radius has to be a valid number, use /checkstock [minimum stock]")); + return; + } + + if (radius > 100 || radius <= 0) { + player.sendMessage(Util.parseMiniMessage("Please keep the radius between 1 and 100")); + return; + } + + if (args.length == 3) { + try { + minimumStock = Integer.parseInt(args[2]); + } catch (NumberFormatException e) { + player.sendMessage(Util.parseMiniMessage("minium stock has to be a valid number, use /checkstock [minimum stock]")); + return; + } + } + playerX = player.getLocation().getBlockX(); + playerZ = player.getLocation().getBlockZ(); + List stockList = checkStock(); + sendStockMessage(player, stockList); + } + + private List checkStock() { + List shops = plugin.getShopHandler().getShopsInRadius(playerX, playerZ, radius); + if (minimumStock != -1) + shops = shops.stream().filter(shop -> shop.getRemainingStock() < minimumStock).collect(Collectors.toList()); + return shops.stream().map(shop -> { + Location signLocation = shop.getSignLocation(); + return new Stock(shop.getRemainingStock(), + signLocation.getBlockX(), + signLocation.getBlockY(), + signLocation.getBlockZ(), + ShopUtil.itemNameComponent(shop.getItemStack())); + }).collect(Collectors.toList()); + } + + private static final String putInConfig = " '>[] left in stock"; + private void sendStockMessage(Player player, List stockList) { + Component component = null; + for (Stock stock : stockList) { + TagResolver resolver = TagResolver.resolver( + Placeholder.component("item_component", stock.itemNameComponent), + Placeholder.parsed("x", stock.x + ""), + Placeholder.parsed("y", stock.y + ""), + Placeholder.parsed("z", stock.z + ""), + Placeholder.parsed("amount", stock.stock + "") + ); + if (component == null) + component = Util.parseMiniMessage(putInConfig, resolver); + else + component = component.append(Component.newline()).append(Util.parseMiniMessage(putInConfig, resolver)); + } + if (component == null) + player.sendMessage(Util.parseMiniMessage( + "No shops with less than stock found.", + TagResolver.resolver(Placeholder.parsed("minimum_stock", minimumStock + "")))); + else + player.sendMessage(component); + } + + private record Stock(int stock, int x, int y, int z, Component itemNameComponent) {} +} diff --git a/src/main/java/com/alttd/playershops/commands/ShopCommand.java b/src/main/java/com/alttd/playershops/commands/ShopCommand.java index cfb9a66..52ea77b 100644 --- a/src/main/java/com/alttd/playershops/commands/ShopCommand.java +++ b/src/main/java/com/alttd/playershops/commands/ShopCommand.java @@ -1,11 +1,8 @@ package com.alttd.playershops.commands; import com.alttd.playershops.PlayerShops; -import com.alttd.playershops.config.Config; -import com.alttd.playershops.config.MessageConfig; import com.alttd.playershops.gui.HomeGui; -import com.alttd.playershops.gui.ShopManagementGui; -import com.alttd.playershops.shop.PlayerShop; +import com.alttd.playershops.utils.Util; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; @@ -33,6 +30,13 @@ public class ShopCommand implements CommandExecutor, TabCompleter { HomeGui gui = new HomeGui(player.getUniqueId()); gui.open(); break; + case "checkstock": + if (!player.hasPermission("playershops.command.playershop.checkstock")) { + sender.sendMessage(Util.parseMiniMessage("playershops.command.playershop.checkstock'>You do not have permission for this command")); + break; + } + new CheckStockCommand(PlayerShops.getInstance(), player, args); + break; default: sender.sendMessage("invalid command useage"); break; diff --git a/src/main/java/com/alttd/playershops/handler/ShopHandler.java b/src/main/java/com/alttd/playershops/handler/ShopHandler.java index f9a0555..6032ac1 100644 --- a/src/main/java/com/alttd/playershops/handler/ShopHandler.java +++ b/src/main/java/com/alttd/playershops/handler/ShopHandler.java @@ -129,6 +129,25 @@ public class ShopHandler { } return null; } + public List getShopsInRadius(int x, int z, int radius) { + ArrayList shops = new ArrayList<>(); + int bottomX = x - radius; + int topX = x + radius; + int bottomZ = z - radius; + int topZ = z + radius; + + for (PlayerShop playerShop : shopLocation.values()) { + if (inRange(bottomX, topX, bottomZ, topZ, playerShop.getShopLocation())) + shops.add(playerShop); + } + return shops; + } + + private boolean inRange(int bottomX, int topX, int bottomZ, int topZ, Location location) { + int x = location.getBlockX(); + int z = location.getBlockZ(); + return (x > bottomX && x < topX && z > bottomZ && z < topZ); + } public void addShop(PlayerShop shop) { shopLocation.put(shop.getShopLocation(), shop);