From 149dd46eafa814c13f16620de0356b0e549556f0 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Wed, 5 Jan 2022 21:42:23 +0100 Subject: [PATCH] Added bulk selling/buying --- .../java/com/alttd/GUI/windows/BuyGUI.java | 8 +- .../java/com/alttd/GUI/windows/OpenGUI.java | 88 ++++++++++++++----- .../java/com/alttd/GUI/windows/SellGUI.java | 17 ++-- 3 files changed, 82 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/alttd/GUI/windows/BuyGUI.java b/src/main/java/com/alttd/GUI/windows/BuyGUI.java index 0034e0a..afc1186 100644 --- a/src/main/java/com/alttd/GUI/windows/BuyGUI.java +++ b/src/main/java/com/alttd/GUI/windows/BuyGUI.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -27,7 +28,7 @@ public class BuyGUI extends GUIMerchant { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); - public BuyGUI(VillagerType villagerType, EconUser econUser) { + public BuyGUI(VillagerType villagerType, EconUser econUser, boolean bulk) { super(miniMessage.deserialize(Config.BUY_WINDOW, TemplateResolver.resolving( Template.template("trader", villagerType.getDisplayName()), Template.template("points", String.valueOf(Objects.requireNonNullElse( @@ -35,6 +36,8 @@ public class BuyGUI extends GUIMerchant { 0))) )), villagerType); for (ItemStack itemStack : villagerType.getBuying()) { + if (bulk) + itemStack.setAmount(itemStack.getMaxStackSize()); Price price = Utilities.getPrice(itemStack, WorthConfig.buy); if (price == null) continue; @@ -58,7 +61,8 @@ public class BuyGUI extends GUIMerchant { if (balance < cost) { player.sendMiniMessage(Config.NOT_ENOUGH_MONEY, List.of( Template.template("money", String.valueOf(Utilities.round(balance, 2))), - Template.template("price", String.valueOf(cost)))); + Template.template("price", String.valueOf(cost)) + )); return; } diff --git a/src/main/java/com/alttd/GUI/windows/OpenGUI.java b/src/main/java/com/alttd/GUI/windows/OpenGUI.java index ec0988b..a382b4a 100644 --- a/src/main/java/com/alttd/GUI/windows/OpenGUI.java +++ b/src/main/java/com/alttd/GUI/windows/OpenGUI.java @@ -18,8 +18,10 @@ import java.util.Objects; public class OpenGUI extends GUIInventory { + private static final ItemStack BULK_BUY = new ItemStack(Material.GOLD_BLOCK); private static final ItemStack BUY = new ItemStack(Material.GOLD_INGOT); private static final ItemStack SELL = new ItemStack(Material.BUCKET); + private static final ItemStack BULK_SELL = new ItemStack(Material.CAULDRON); private static final MiniMessage miniMessage; static { miniMessage = MiniMessage.miniMessage(); @@ -34,6 +36,16 @@ public class OpenGUI extends GUIInventory { itemMeta.displayName(miniMessage.deserialize("Sell")); SELL.setItemMeta(itemMeta); } + { + itemMeta = BULK_BUY.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize("Bulk Buy")); + BULK_BUY.setItemMeta(itemMeta); + } + { + itemMeta = BULK_SELL.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize("Bulk Sell")); + BULK_SELL.setItemMeta(itemMeta); + } } public OpenGUI(VillagerType villagerType, EconUser econUser) { @@ -43,29 +55,57 @@ public class OpenGUI extends GUIInventory { econUser.getPointsMap().get(villagerType.getName()), 0))))) ); - setItem(1, BUY, player -> new BukkitRunnable() { - @Override - public void run() { - BuyGUI buyGUI = new BuyGUI(villagerType, econUser); - new BukkitRunnable() { - @Override - public void run() { - buyGUI.open(player); - } - }.runTask(VillagerUI.getInstance()); - } - }.runTaskAsynchronously(VillagerUI.getInstance())); - setItem(3, SELL, player -> new BukkitRunnable() { - @Override - public void run() { - SellGUI sellGUI = new SellGUI(villagerType, econUser); - new BukkitRunnable() { - @Override - public void run() { - sellGUI.open(player); - } - }.runTask(VillagerUI.getInstance()); - } - }.runTaskAsynchronously(VillagerUI.getInstance())); + if (!villagerType.getBuying().isEmpty()) { + setItem(0, BULK_BUY, player -> new BukkitRunnable() { + @Override + public void run() { + BuyGUI buyGUI = new BuyGUI(villagerType, econUser, true); + new BukkitRunnable() { + @Override + public void run() { + buyGUI.open(player); + } + }.runTask(VillagerUI.getInstance()); + } + }.runTaskAsynchronously(VillagerUI.getInstance())); + setItem(1, BUY, player -> new BukkitRunnable() { + @Override + public void run() { + BuyGUI buyGUI = new BuyGUI(villagerType, econUser, false); + new BukkitRunnable() { + @Override + public void run() { + buyGUI.open(player); + } + }.runTask(VillagerUI.getInstance()); + } + }.runTaskAsynchronously(VillagerUI.getInstance())); + } + if (!villagerType.getSelling().isEmpty()) { + setItem(3, SELL, player -> new BukkitRunnable() { + @Override + public void run() { + SellGUI sellGUI = new SellGUI(villagerType, econUser, false); + new BukkitRunnable() { + @Override + public void run() { + sellGUI.open(player); + } + }.runTask(VillagerUI.getInstance()); + } + }.runTaskAsynchronously(VillagerUI.getInstance())); + setItem(4, BULK_SELL, player -> new BukkitRunnable() { + @Override + public void run() { + SellGUI sellGUI = new SellGUI(villagerType, econUser, true); + new BukkitRunnable() { + @Override + public void run() { + sellGUI.open(player); + } + }.runTask(VillagerUI.getInstance()); + } + }.runTaskAsynchronously(VillagerUI.getInstance())); + } } } diff --git a/src/main/java/com/alttd/GUI/windows/SellGUI.java b/src/main/java/com/alttd/GUI/windows/SellGUI.java index 1bb6ca0..4570eeb 100644 --- a/src/main/java/com/alttd/GUI/windows/SellGUI.java +++ b/src/main/java/com/alttd/GUI/windows/SellGUI.java @@ -30,34 +30,41 @@ public class SellGUI extends GUIMerchant { private static final MiniMessage miniMessage = MiniMessage.miniMessage(); - public SellGUI(VillagerType villagerType, EconUser econUser) { + public SellGUI(VillagerType villagerType, EconUser econUser, boolean bulk) { super(MiniMessage.miniMessage().deserialize(Config.SELL_WINDOW, TemplateResolver.resolving( Template.template("trader", villagerType.getDisplayName()), Template.template("points", String.valueOf(Objects .requireNonNullElse(econUser.getPointsMap().get(villagerType.getName()) , 0))))), villagerType); for (ItemStack itemStack : villagerType.getSelling()) { + if (bulk) + itemStack.setAmount(1); Price price = Utilities.getPrice(itemStack, WorthConfig.sell); if (price == null) continue; addItem(itemStack, getPriceItem(price.getPrice(itemStack.getAmount())), null, - player -> sell(villagerType, player, itemStack.getType(), itemStack.getAmount(), price) + player -> sell(villagerType, player, itemStack.getType(), itemStack.getAmount(), price, bulk) ); } } - private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price) { + private void sell(VillagerType villagerType, Player player, Material material, int amount, Price price, boolean bulk) { PlayerInventory inventory = player.getInventory(); - if (!inventory.containsAtLeast(new ItemStack(material), amount)) { + if (!inventory.containsAtLeast(new ItemStack(material), bulk ? 1 : amount)) { player.sendMiniMessage(Config.NOT_ENOUGH_ITEMS, List.of( Template.template("type", material.name()), - Template.template("amount", String.valueOf(amount)))); + Template.template("amount", String.valueOf(bulk ? 1 : amount)))); return; } + if (bulk) + amount = Arrays.stream(inventory.getContents()) + .filter(Objects::nonNull) + .filter(itemStack -> itemStack.getType().equals(material)) + .mapToInt(ItemStack::getAmount).sum(); Economy econ = VillagerUI.getInstance().getEconomy(); EconUser econUser = EconUser.getUser(player.getUniqueId()); int oldPoints = Objects.requireNonNullElse(econUser.getPointsMap().get(villagerType.getName()), 0);