diff --git a/src/main/java/com/alttd/playershops/commands/subcommands/CheckStockCommand.java b/src/main/java/com/alttd/playershops/commands/subcommands/CheckStockCommand.java index 27dfb0b..09af2b7 100644 --- a/src/main/java/com/alttd/playershops/commands/subcommands/CheckStockCommand.java +++ b/src/main/java/com/alttd/playershops/commands/subcommands/CheckStockCommand.java @@ -7,12 +7,15 @@ import com.alttd.playershops.commands.Subcommand; import com.alttd.playershops.shop.PlayerShop; import com.alttd.playershops.utils.ShopUtil; import com.alttd.playershops.utils.Util; +import com.destroystokyo.paper.ParticleBuilder; 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.Particle; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.framework.qual.DefaultQualifier; @@ -76,12 +79,62 @@ public class CheckStockCommand implements Subcommand { } List stockList = checkStock(player.getLocation().getBlockX(), player.getLocation().getBlockZ(), radius, player); sendStockMessage(player, stockList); + highlightLowStock(player, stockList); return true; } + //Stole this code from AlttdUtility by ___Kappa___ and reworked it slightly + private void highlightLowStock(Player player, List stockList) { + ParticleBuilder particleBuilder = new ParticleBuilder(Particle.REDSTONE); + particleBuilder.color(255, 255, 255); + particleBuilder.receivers(player); + particleBuilder.count(3); + + List collect = stockList.stream().map(stock -> { + Location centerOfBlock = stock.shopCenter; + Location[] cornersOfBlock = new Location[8]; + cornersOfBlock[0] = centerOfBlock.clone().add(0.5, 0.5, 0.5); + cornersOfBlock[1] = centerOfBlock.clone().add(0.5, 0.5, -0.5); + cornersOfBlock[2] = centerOfBlock.clone().add(-0.5, 0.5, 0.5); + cornersOfBlock[3] = centerOfBlock.clone().add(-0.5, 0.5, -0.5); + cornersOfBlock[4] = centerOfBlock.clone().add(0.5, -0.5, 0.5); + cornersOfBlock[5] = centerOfBlock.clone().add(0.5, -0.5, -0.5); + cornersOfBlock[6] = centerOfBlock.clone().add(-0.5, -0.5, 0.5); + cornersOfBlock[7] = centerOfBlock.clone().add(-0.5, -0.5, -0.5); + return cornersOfBlock; + }).toList(); + + + for (int i = 0; i < 10; i++) { + new ParticleSpawnTask(collect, particleBuilder).runTaskLater(PlayerShops.getInstance(), i * 10); + } + } + + private static class ParticleSpawnTask extends BukkitRunnable { + + private final List chestLocations; + private final ParticleBuilder particleBuilder; + + public ParticleSpawnTask(List chestLocations, ParticleBuilder particleBuilder) { + this.chestLocations = chestLocations; + this.particleBuilder = particleBuilder; + } + + @Override + public void run() { + for (Location[] particleLocations : chestLocations) { + for (Location location : particleLocations) { + particleBuilder.location(location); + particleBuilder.spawn(); + } + } + } + } + //End stolen code + /** - * @param x Coordinate to center search on - * @param z Coordinate to center search on + * @param x Coordinate to shopCenter search on + * @param z Coordinate to shopCenter search on * @param radius Range to check in * @param caller Player who is checking for stock, can only see the stock from their shops unless they have base_perm.checkstock.bypass * @return A list of Stock that the player is allowed to see @@ -90,12 +143,13 @@ public class CheckStockCommand implements Subcommand { List shops = PlayerShops.getInstance().getShopHandler().getShopsInRadius(x, z, radius); Stream playerShopStream = shops.stream(); if (minimumStock != -1) - playerShopStream = playerShopStream.filter(shop -> shop.getRemainingStock() / shop.getAmount() < minimumStock); + playerShopStream = playerShopStream.filter(shop -> shop.getRemainingStock() < minimumStock); if (!caller.hasPermission(PlayerShopCommand.BASE_PERM + ".checkstock.any")) playerShopStream = playerShopStream.filter(shop -> shop.getOwnerUUID().equals(caller.getUniqueId())); return playerShopStream.map(shop -> { Location signLocation = shop.getSignLocation(); - return new Stock(shop.getRemainingStock() / shop.getAmount(), + return new Stock(shop.getRemainingStock(), + shop.getShopLocation().toCenterLocation(), signLocation.getBlockX(), signLocation.getBlockY(), signLocation.getBlockZ(), @@ -130,5 +184,5 @@ public class CheckStockCommand implements Subcommand { player.sendMessage(component); } - private record Stock(int stock, int x, int y, int z, Component itemNameComponent) {} + private record Stock(int stock, Location shopCenter, int x, int y, int z, Component itemNameComponent) {} }