From 3581daf1285017a7201dbf19d546f15e5c849e81 Mon Sep 17 00:00:00 2001 From: OmerBenGera Date: Sat, 13 Aug 2022 12:22:55 +0300 Subject: [PATCH] Fixed a duplication glitch when other plugins try to remove items from storage units (#109) --- .../wildchests/objects/chests/WChest.java | 6 +++- .../objects/chests/WStorageChest.java | 36 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/bgsoftware/wildchests/objects/chests/WChest.java b/src/main/java/com/bgsoftware/wildchests/objects/chests/WChest.java index ae850f64..d0b38dfb 100644 --- a/src/main/java/com/bgsoftware/wildchests/objects/chests/WChest.java +++ b/src/main/java/com/bgsoftware/wildchests/objects/chests/WChest.java @@ -160,7 +160,11 @@ public void removeItem(int amountToRemove, ItemStack itemStack) { int toRemove = Math.min(amountToRemove - itemsRemoved, ItemUtils.countItems(itemStack, page)); ItemStack cloned = itemStack.clone(); cloned.setAmount(toRemove); - page.removeItem(cloned); + ItemStack leftOver = page.removeItem(cloned).get(0); + + if(leftOver != null) + toRemove -= leftOver.getAmount(); + itemsRemoved += toRemove; } } diff --git a/src/main/java/com/bgsoftware/wildchests/objects/chests/WStorageChest.java b/src/main/java/com/bgsoftware/wildchests/objects/chests/WStorageChest.java index c83c8f34..e073b8aa 100644 --- a/src/main/java/com/bgsoftware/wildchests/objects/chests/WStorageChest.java +++ b/src/main/java/com/bgsoftware/wildchests/objects/chests/WStorageChest.java @@ -220,28 +220,42 @@ public void update() { public Map addItems(ItemStack... itemStacks) { Map additionalItems = new HashMap<>(); - ItemStack storageItem = getItemStack(); + BigInteger amountToAdd = BigInteger.ZERO; for (int i = 0; i < itemStacks.length; i++) { - ItemStack itemStack = itemStacks[i]; - - if (storageItem.getType() == Material.AIR) { - setItemStack(itemStack); - storageItem = itemStack.clone(); - } + if (itemStacks[i] == null) + continue; - if (storageItem.isSimilar(itemStack)) { - setAmount(getAmount().add(BigInteger.valueOf(itemStack.getAmount()))); + if (!canPlaceItemThroughFace(itemStacks[i])) { + additionalItems.put(i, itemStacks[i]); } else { - additionalItems.put(i, itemStack); + if (getItemStack().getType() == Material.AIR) + setItemStack(itemStacks[i]); + + amountToAdd = amountToAdd.add(BigInteger.valueOf(itemStacks[i].getAmount())); } } - updateInventory(getPage(0)); + if (amountToAdd.compareTo(getAmount()) != 0) { + setAmount(getAmount().add(amountToAdd)); + updateInventory(getPage(0)); + } return additionalItems; } + @Override + public void removeItem(int amountToRemove, ItemStack itemStack) { + ItemStack storageItem = getItemStack(); + + if (storageItem.getType() == Material.AIR || !storageItem.isSimilar(itemStack)) + return; // Storage unit is empty + + setAmount(getAmount().subtract(BigInteger.valueOf(amountToRemove))); + + updateInventory(getPage(0)); + } + @Override public boolean onBreak(BlockBreakEvent event) { broken = true;