diff --git a/src/main/java/com/Acrobot/Breeze/Utils/InventoryUtil.java b/src/main/java/com/Acrobot/Breeze/Utils/InventoryUtil.java index 12af56dfc..8fc35606f 100644 --- a/src/main/java/com/Acrobot/Breeze/Utils/InventoryUtil.java +++ b/src/main/java/com/Acrobot/Breeze/Utils/InventoryUtil.java @@ -72,11 +72,9 @@ public static boolean isEmpty(Inventory inventory) { * inventory * @return Does the inventory contain stock of this type? */ - public static boolean hasItems(ItemStack[] items, Inventory inventory) { - for (ItemStack item : items) { - if (!inventory.containsAtLeast(item, item.getAmount())) { - return false; - } + public static boolean hasItems(ItemStack item, Inventory inventory) { + if (!inventory.containsAtLeast(item, item.getAmount())) { + return false; } return true; diff --git a/src/main/java/com/Acrobot/ChestShop/Events/PreTransactionEvent.java b/src/main/java/com/Acrobot/ChestShop/Events/PreTransactionEvent.java index 26ec47b8b..d1544d562 100644 --- a/src/main/java/com/Acrobot/ChestShop/Events/PreTransactionEvent.java +++ b/src/main/java/com/Acrobot/ChestShop/Events/PreTransactionEvent.java @@ -28,12 +28,12 @@ public class PreTransactionEvent extends Event { private Inventory ownerInventory; private Inventory clientInventory; - private ItemStack[] items; + private ItemStack items; private double price; private TransactionOutcome transactionOutcome = TRANSACTION_SUCCESFUL; - public PreTransactionEvent(Inventory ownerInventory, Inventory clientInventory, ItemStack[] items, double price, Player client, OfflinePlayer owner, Sign sign, TransactionType type) { + public PreTransactionEvent(Inventory ownerInventory, Inventory clientInventory, ItemStack items, double price, Player client, OfflinePlayer owner, Sign sign, TransactionType type) { this.ownerInventory = ownerInventory; this.clientInventory = (clientInventory == null ? client.getInventory() : clientInventory); @@ -77,14 +77,14 @@ public void setPrice(double price) { * @param stock * Stock */ - public void setStock(ItemStack... stock) { + public void setStock(ItemStack stock) { items = stock; } /** * @return Stock available */ - public ItemStack[] getStock() { + public ItemStack getStock() { return items; } @@ -177,6 +177,7 @@ public void setCancelled(TransactionOutcome reason) { transactionOutcome = reason; } + @Override public HandlerList getHandlers() { return handlers; } @@ -186,21 +187,28 @@ public static HandlerList getHandlerList() { } public enum TransactionOutcome { - SHOP_DOES_NOT_BUY_THIS_ITEM, SHOP_DOES_NOT_SELL_THIS_ITEM, + SHOP_DOES_NOT_BUY_THIS_ITEM, + SHOP_DOES_NOT_SELL_THIS_ITEM, CLIENT_DOES_NOT_HAVE_PERMISSION, - CLIENT_DOES_NOT_HAVE_ENOUGH_MONEY, SHOP_DOES_NOT_HAVE_ENOUGH_MONEY, + CLIENT_DOES_NOT_HAVE_ENOUGH_MONEY, + SHOP_DOES_NOT_HAVE_ENOUGH_MONEY, - CLIENT_DEPOSIT_FAILED, SHOP_DEPOSIT_FAILED, + CLIENT_DEPOSIT_FAILED, + SHOP_DEPOSIT_FAILED, - NOT_ENOUGH_SPACE_IN_CHEST, NOT_ENOUGH_SPACE_IN_INVENTORY, + NOT_ENOUGH_SPACE_IN_CHEST, + NOT_ENOUGH_SPACE_IN_INVENTORY, - NOT_ENOUGH_STOCK_IN_CHEST, NOT_ENOUGH_STOCK_IN_INVENTORY, + NOT_ENOUGH_STOCK_IN_CHEST, + NOT_ENOUGH_STOCK_IN_INVENTORY, INVALID_SHOP, - SPAM_CLICKING_PROTECTION, CREATIVE_MODE_PROTECTION, SHOP_IS_RESTRICTED, + SPAM_CLICKING_PROTECTION, + CREATIVE_MODE_PROTECTION, + SHOP_IS_RESTRICTED, OTHER, // For plugin use! diff --git a/src/main/java/com/Acrobot/ChestShop/Events/TransactionEvent.java b/src/main/java/com/Acrobot/ChestShop/Events/TransactionEvent.java index 43b991edb..8da6e62e3 100644 --- a/src/main/java/com/Acrobot/ChestShop/Events/TransactionEvent.java +++ b/src/main/java/com/Acrobot/ChestShop/Events/TransactionEvent.java @@ -23,7 +23,7 @@ public class TransactionEvent extends Event { private final Player client; private final OfflinePlayer owner; - private final ItemStack[] stock; + private final ItemStack stock; private final double price; private final Sign sign; @@ -43,7 +43,7 @@ public TransactionEvent(PreTransactionEvent event, Sign sign) { this.sign = sign; } - public TransactionEvent(TransactionType type, Inventory ownerInventory, Inventory clientInventory, Player client, OfflinePlayer owner, ItemStack[] stock, double price, Sign sign) { + public TransactionEvent(TransactionType type, Inventory ownerInventory, Inventory clientInventory, Player client, OfflinePlayer owner, ItemStack stock, double price, Sign sign) { this.type = type; this.ownerInventory = ownerInventory; @@ -96,7 +96,7 @@ public OfflinePlayer getOwner() { /** * @return Stock available */ - public ItemStack[] getStock() { + public ItemStack getStock() { return stock; } @@ -114,6 +114,7 @@ public Sign getSign() { return sign; } + @Override public HandlerList getHandlers() { return handlers; } @@ -126,6 +127,7 @@ public static HandlerList getHandlerList() { * Possible transaction types */ public enum TransactionType { - BUY, SELL + BUY, + SELL } } 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 166b4a5b9..451f16e43 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/Player/PlayerInteract.java @@ -210,10 +210,8 @@ private static PreTransactionEvent preparePreTransactionEvent(Sign sign, Player item.setAmount(amount); - ItemStack[] items = { item }; - TransactionType transactionType = (action == buy ? BUY : SELL); - return new PreTransactionEvent(ownerInventory, player.getInventory(), items, price, player, owner, sign, transactionType); + return new PreTransactionEvent(ownerInventory, player.getInventory(), item, price, player, owner, sign, transactionType); } private static boolean isAllowedForShift(boolean buyTransaction) { diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/EmptyShopDeleter.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/EmptyShopDeleter.java index 4d5678ff3..581ec0e9b 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/EmptyShopDeleter.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/EmptyShopDeleter.java @@ -61,7 +61,7 @@ public static void onTransaction(TransactionEvent event) { } } - private static boolean shopShouldBeRemoved(Inventory inventory, ItemStack[] stock) { + private static boolean shopShouldBeRemoved(Inventory inventory, ItemStack stock) { return Properties.REMOVE_EMPTY_SHOPS && !ChestShopSign.isAdminShop(inventory) && !InventoryUtil.hasItems(stock, inventory); } } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/ItemManager.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/ItemManager.java index e80065463..d8781f51a 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/ItemManager.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/ItemManager.java @@ -40,21 +40,15 @@ public static void inventoryItemRemover(TransactionEvent event) { event.getClient().updateInventory(); } - private static void removeItems(Inventory inventory, ItemStack[] items) { - for (ItemStack item : items) { - InventoryUtil.remove(item, inventory); - } + private static void removeItems(Inventory inventory, ItemStack item) { + InventoryUtil.remove(item, inventory); } - private static void addItems(Inventory inventory, ItemStack[] items) { + private static void addItems(Inventory inventory, ItemStack item) { if (Properties.STACK_TO_64) { - for (ItemStack item : items) { - InventoryUtil.add(item, inventory, 64); - } + InventoryUtil.add(item, inventory, 64); } else { - for (ItemStack item : items) { - InventoryUtil.add(item, inventory); - } + InventoryUtil.add(item, inventory); } } } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionLogger.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionLogger.java index e371e4f74..a3d14a98d 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionLogger.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionLogger.java @@ -26,9 +26,8 @@ public static void onTransaction(final TransactionEvent event) { StringBuilder items = new StringBuilder(50); - for (ItemStack item : event.getStock()) { - items.append(item.getAmount()).append(' ').append(getSignName(item)); - } + ItemStack item = event.getStock(); + items.append(item.getAmount()).append(' ').append(getSignName(item)); String message = String.format(template, event.getClient().getUniqueId().toString(), event.getClient().getName(), items.toString(), event.getPrice(), event.getOwner().getUniqueId().toString(), NameManager.getFullNameFor(event.getOwner().getUniqueId()), LocationUtil.locationToString(event.getSign().getLocation())); diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionMessageSender.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionMessageSender.java index 2ed038ac0..fd61cf53a 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionMessageSender.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PostTransaction/TransactionMessageSender.java @@ -11,7 +11,6 @@ import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; -import com.Acrobot.Breeze.Utils.InventoryUtil; import com.Acrobot.ChestShop.Commands.Toggle; import com.Acrobot.ChestShop.Configuration.Messages; import com.Acrobot.ChestShop.Configuration.Properties; @@ -75,20 +74,13 @@ protected static void sendSellMessage(TransactionEvent event) { } } - private static BaseComponent[] parseItemInformation(ItemStack[] items) { - ItemStack[] stock = InventoryUtil.mergeSimilarStacks(items); - + private static BaseComponent[] parseItemInformation(ItemStack item) { ArrayList message = new ArrayList<>(); // StringBuilder message = new StringBuilder(15); // Joiner joiner = Joiner.on(' '); - for (ItemStack item : stock) { - if (!message.isEmpty()) { - message.add(new TextComponent(", ")); - } - message.add(new TextComponent(item.getAmount() + " ")); - message.add(ComponentUtils.getLocalizedItemName(item.getType())); - } + message.add(new TextComponent(item.getAmount() + " ")); + message.add(ComponentUtils.getLocalizedItemName(item.getType())); return message.toArray(new BaseComponent[message.size()]); } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/AmountAndPriceChecker.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/AmountAndPriceChecker.java index e1a347979..d78f961c1 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/AmountAndPriceChecker.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/AmountAndPriceChecker.java @@ -26,7 +26,7 @@ public static void onBuyItemCheck(PreTransactionEvent event) { return; } - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); Inventory ownerInventory = event.getOwnerInventory(); CurrencyCheckEvent currencyCheckEvent = new CurrencyCheckEvent(BigDecimal.valueOf(event.getPrice()), event.getClient()); @@ -48,7 +48,7 @@ public static void onSellItemCheck(PreTransactionEvent event) { return; } - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); Inventory clientInventory = event.getClientInventory(); CurrencyCheckEvent currencyCheckEvent = new CurrencyCheckEvent(BigDecimal.valueOf(event.getPrice()), event.getOwner().getUniqueId(), event.getSign().getWorld()); diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ErrorMessageSender.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ErrorMessageSender.java index 5a60ad74c..d88a5e2a4 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ErrorMessageSender.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ErrorMessageSender.java @@ -12,7 +12,6 @@ import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; -import com.Acrobot.Breeze.Utils.InventoryUtil; import com.Acrobot.Breeze.Utils.MaterialUtil; import com.Acrobot.ChestShop.Commands.Toggle; import com.Acrobot.ChestShop.Configuration.Messages; @@ -94,17 +93,10 @@ public static void onMessage(PreTransactionEvent event) { } } - private static String getItemNames(ItemStack[] stock) { - ItemStack[] items = InventoryUtil.mergeSimilarStacks(stock); - + private static String getItemNames(ItemStack stock) { StringBuilder names = new StringBuilder(50); - for (ItemStack item : items) { - if (names.length() > 0) { - names.append(',').append(' '); - } - names.append(MaterialUtil.getName(item.getType())); - } + names.append(MaterialUtil.getName(stock.getType())); return names.toString(); } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PartialTransactionModule.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PartialTransactionModule.java index 50c489bec..7d15b9a41 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PartialTransactionModule.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PartialTransactionModule.java @@ -10,15 +10,12 @@ import static com.Acrobot.ChestShop.Events.TransactionEvent.TransactionType.SELL; import java.math.BigDecimal; -import java.util.LinkedList; -import java.util.List; import java.util.UUID; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import com.Acrobot.Breeze.Utils.InventoryUtil; @@ -41,7 +38,7 @@ public static void onPreBuyTransaction(PreTransactionEvent event) { } Player client = event.getClient(); - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); double price = event.getPrice(); double pricePerItem = event.getPrice() / InventoryUtil.countItems(stock); @@ -63,7 +60,9 @@ public static void onPreBuyTransaction(PreTransactionEvent event) { } event.setPrice(amountAffordable * pricePerItem); - event.setStock(getCountedItemStack(stock, amountAffordable)); + stock = new ItemStack(stock); + stock.setAmount(amountAffordable); + event.setStock(stock); } UUID seller = event.getOwner().getUniqueId(); @@ -79,14 +78,15 @@ public static void onPreBuyTransaction(PreTransactionEvent event) { stock = event.getStock(); if (!InventoryUtil.hasItems(stock, event.getOwnerInventory())) { - ItemStack[] itemsHad = getItems(stock, event.getOwnerInventory()); - int posessedItemCount = InventoryUtil.countItems(itemsHad); - + int posessedItemCount = InventoryUtil.getAmount(stock, event.getClientInventory()); if (posessedItemCount <= 0) { event.setCancelled(NOT_ENOUGH_STOCK_IN_CHEST); return; } + ItemStack itemsHad = new ItemStack(stock); + itemsHad.setAmount(posessedItemCount); + event.setPrice(pricePerItem * posessedItemCount); event.setStock(itemsHad); } @@ -100,7 +100,7 @@ public static void onPreSellTransaction(PreTransactionEvent event) { Player client = event.getClient(); UUID owner = event.getOwner().getUniqueId(); - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); double price = event.getPrice(); double pricePerItem = event.getPrice() / InventoryUtil.countItems(stock); @@ -123,7 +123,9 @@ public static void onPreSellTransaction(PreTransactionEvent event) { } event.setPrice(amountAffordable * pricePerItem); - event.setStock(getCountedItemStack(stock, amountAffordable)); + stock = new ItemStack(stock); + stock.setAmount(amountAffordable); + event.setStock(stock); } } @@ -138,14 +140,15 @@ public static void onPreSellTransaction(PreTransactionEvent event) { } if (!InventoryUtil.hasItems(stock, event.getClientInventory())) { - ItemStack[] itemsHad = getItems(stock, event.getClientInventory()); - int posessedItemCount = InventoryUtil.countItems(itemsHad); - + int posessedItemCount = InventoryUtil.getAmount(stock, event.getClientInventory()); if (posessedItemCount <= 0) { event.setCancelled(NOT_ENOUGH_STOCK_IN_INVENTORY); return; } + ItemStack itemsHad = new ItemStack(stock); + itemsHad.setAmount(posessedItemCount); + event.setPrice(pricePerItem * posessedItemCount); event.setStock(itemsHad); } @@ -154,62 +157,4 @@ public static void onPreSellTransaction(PreTransactionEvent event) { private static int getAmountOfAffordableItems(BigDecimal walletMoney, double pricePerItem) { return (int) Math.floor(walletMoney.doubleValue() / pricePerItem); } - - private static ItemStack[] getItems(ItemStack[] stock, Inventory inventory) { - List toReturn = new LinkedList(); - - ItemStack[] neededItems = InventoryUtil.mergeSimilarStacks(stock); - - for (ItemStack item : neededItems) { - int amount = InventoryUtil.getAmount(item, inventory); - - ItemStack clone = new ItemStack(item); - clone.setAmount(amount > item.getAmount() ? item.getAmount() : amount); - - toReturn.add(clone); - } - - return toReturn.toArray(new ItemStack[toReturn.size()]); - } - - private static ItemStack[] getCountedItemStack(ItemStack[] stock, int numberOfItems) { - int left = numberOfItems; - LinkedList stacks = new LinkedList(); - - for (ItemStack stack : stock) { - int count = stack.getAmount(); - ItemStack toAdd; - - if (left > count) { - toAdd = stack; - left -= count; - } else { - ItemStack clone = stack.clone(); - - clone.setAmount(left); - toAdd = clone; - left = 0; - } - - boolean added = false; - - for (ItemStack iStack : stacks) { - if (toAdd.isSimilar(iStack)) { - iStack.setAmount(iStack.getAmount() + toAdd.getAmount()); - added = true; - break; - } - } - - if (!added) { - stacks.add(toAdd); - } - - if (left <= 0) { - break; - } - } - - return stacks.toArray(new ItemStack[stacks.size()]); - } } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PermissionChecker.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PermissionChecker.java index e204a861a..cc188472d 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PermissionChecker.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/PermissionChecker.java @@ -25,21 +25,20 @@ public static void onPermissionCheck(PreTransactionEvent event) { Player client = event.getClient(); TransactionEvent.TransactionType transactionType = event.getTransactionType(); - for (ItemStack stock : event.getStock()) { - String matID = stock.getType().name().toLowerCase(); + ItemStack stock = event.getStock(); + String matID = stock.getType().name().toLowerCase(); - boolean hasPerm; + boolean hasPerm; - if (transactionType == BUY) { - hasPerm = Permission.has(client, Permission.BUY) || Permission.has(client, Permission.BUY_ID + matID); - } else { - hasPerm = Permission.has(client, Permission.SELL) || Permission.has(client, Permission.SELL_ID + matID); - } + if (transactionType == BUY) { + hasPerm = Permission.has(client, Permission.BUY) || Permission.has(client, Permission.BUY_ID + matID); + } else { + hasPerm = Permission.has(client, Permission.SELL) || Permission.has(client, Permission.SELL_ID + matID); + } - if (!hasPerm) { - event.setCancelled(CLIENT_DOES_NOT_HAVE_PERMISSION); - return; - } + if (!hasPerm) { + event.setCancelled(CLIENT_DOES_NOT_HAVE_PERMISSION); + return; } } } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ShopValidator.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ShopValidator.java index fb8405df8..629f6126c 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ShopValidator.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/ShopValidator.java @@ -18,7 +18,7 @@ public static void onCheck(PreTransactionEvent event) { return; } - if (isEmpty(event.getStock())) { + if (event.getStock() == null) { event.setCancelled(INVALID_SHOP); return; } @@ -27,14 +27,4 @@ public static void onCheck(PreTransactionEvent event) { event.setCancelled(INVALID_SHOP); } } - - private static boolean isEmpty(A[] array) { - for (A element : array) { - if (element != null) { - return false; - } - } - - return true; - } } diff --git a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/StockFittingChecker.java b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/StockFittingChecker.java index fd11551c2..be674a57f 100644 --- a/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/StockFittingChecker.java +++ b/src/main/java/com/Acrobot/ChestShop/Listeners/PreTransaction/StockFittingChecker.java @@ -23,9 +23,9 @@ public static void onSellCheck(PreTransactionEvent event) { } Inventory shopInventory = event.getOwnerInventory(); - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); - if (!itemsFitInInventory(stock, shopInventory)) { + if (!InventoryUtil.fits(stock, shopInventory)) { event.setCancelled(NOT_ENOUGH_SPACE_IN_CHEST); } } @@ -37,20 +37,10 @@ public static void onBuyCheck(PreTransactionEvent event) { } Inventory clientInventory = event.getClientInventory(); - ItemStack[] stock = event.getStock(); + ItemStack stock = event.getStock(); - if (!itemsFitInInventory(stock, clientInventory)) { + if (!InventoryUtil.fits(stock, clientInventory)) { event.setCancelled(NOT_ENOUGH_SPACE_IN_INVENTORY); } } - - private static boolean itemsFitInInventory(ItemStack[] items, Inventory inventory) { - for (ItemStack item : items) { - if (!InventoryUtil.fits(item, inventory)) { - return false; - } - } - - return true; - } }