From f6fa1f7ced8b44ee441bdfefd8f73dc81ad458f9 Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 21:07:35 +0200 Subject: [PATCH 1/6] Drop items instead of deleting them Also taking into consideration that `Inventory#remove` deletes all items of the same type. --- .../backpacksplus/utils/InventoryWatcher.java | 23 +++++++++++-------- src/main/resources/lang/de.yml | 4 ++-- src/main/resources/lang/en.yml | 4 ++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 48ddd1e..70c870e 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -25,6 +25,8 @@ import io.github.coachluck.backpacksplus.utils.lang.MessageKey; import lombok.Setter; import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; @@ -96,11 +98,16 @@ public void run() { timer++; - PlayerInventory inventory = player.getInventory(); + ItemStack[] items = player.getInventory().getContents(); + Location location = player.getLocation(); + World world = player.getWorld(); int count = 0; int removedCount = 0; - for (ItemStack itemStack : inventory.getContents()) { + + for (int i = 0; i < items.length; ++i) { + ItemStack itemStack = items[i]; + if (itemStack == null) continue; ItemMeta meta = itemStack.getItemMeta(); @@ -114,14 +121,12 @@ public void run() { int difference = itemStack.getAmount() - amountToKeep; removedCount = removedCount + difference; - if(difference > 0) { - itemStack.setAmount(difference); - player.getInventory().remove(itemStack); - } - - if(amountToKeep > 0) { + if (difference > 0) { itemStack.setAmount(amountToKeep); - player.getInventory().addItem(itemStack); + player.getInventory().setItem(i, itemStack); + + itemStack.setAmount(difference); + world.dropItem(location, itemStack); } } } diff --git a/src/main/resources/lang/de.yml b/src/main/resources/lang/de.yml index d0f5bf3..1a0a364 100644 --- a/src/main/resources/lang/de.yml +++ b/src/main/resources/lang/de.yml @@ -8,7 +8,7 @@ General: BadArgs: "&cFalsche Argumente! &eschreib &7/bpp help &efür hilfe." Console: "&8[&cBack&ePacks&b+&8] &cSie müssen ein Spieler sein, um diesen Befehl verwenden zu können!" NotFound: "&e%backpack% &cexistiert nicht." - OverLimit: "&7wurden entfernt &c%removed% Rucksäcke aus deinem Inventar &7weil du nur + OverLimit: "&c%removed% Rucksäcke wurden auf den Boden geworfen &7weil du nur &e%limit% &7gleichzeitig tragen darfst." BackPack: ItemNotAllowed: "%backpack% &cSie können &e%item% &cnicht darin speichern." @@ -33,4 +33,4 @@ Help: - " &8- &7Gibt dem Spieler den angegebenen Rucksack" - " &e/bpp &areload &8- &7Ladet das plugin neu." - "&7&m " - - "" \ No newline at end of file + - "" diff --git a/src/main/resources/lang/en.yml b/src/main/resources/lang/en.yml index 231ed0b..4d202b0 100644 --- a/src/main/resources/lang/en.yml +++ b/src/main/resources/lang/en.yml @@ -9,7 +9,7 @@ General: BadArgs: "&cIncorrect arguments! &eType &7/bpp help &efor help." Console: "&8[&cBack&ePacks&b+&8] &cYou must be a player to use this command!" NotFound: "&e%backpack% &cdoes not exist." - OverLimit: "&7Removed &c%removed% backpacks &7because you are only allowed to carry &e%limit% &7at once." + OverLimit: "&7Dropped &c%removed% backpacks &7because you are only allowed to carry &e%limit% &7at once." BackPack: ItemNotAllowed: "%backpack% &cdoes not let you store &e%item% &cinside." OnCraft: @@ -33,4 +33,4 @@ Help: - " &8- &7Give the player the specified backpack" - " &e/bpp &areload &8- &7Reloads the plugin." - "&7&m " - - "" \ No newline at end of file + - "" From 2796e9eaa710ef7e2e9e91da3d7dd27ecc6dead6 Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 21:20:13 +0200 Subject: [PATCH 2/6] Drop item first, then delete it This is because if you set the amount to 0 the itemStack becomes air. Dropping it first gurantuees that this doesn't happen. --- .../coachluck/backpacksplus/utils/InventoryWatcher.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 70c870e..9eea280 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -122,11 +122,13 @@ public void run() { removedCount = removedCount + difference; if (difference > 0) { - itemStack.setAmount(amountToKeep); - player.getInventory().setItem(i, itemStack); - + // Drop item first itemStack.setAmount(difference); world.dropItem(location, itemStack); + + // Then delete it + itemStack.setAmount(amountToKeep); + player.getInventory().setItem(i, itemStack); } } } From affec900f1dd9b0099a427ffe817402fe24afc83 Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 21:38:24 +0200 Subject: [PATCH 3/6] Items need to be dropped synchronously --- .../backpacksplus/utils/InventoryWatcher.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 9eea280..65b5414 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -124,7 +124,7 @@ public void run() { if (difference > 0) { // Drop item first itemStack.setAmount(difference); - world.dropItem(location, itemStack); + dropItem(world, location, itemStack); // Then delete it itemStack.setAmount(amountToKeep); @@ -174,5 +174,15 @@ private int getLimit(Player player) return rValue.intValue(); } + + private void dropItem(final World world, final Location location, final ItemStack itemStack) + { + final ItemStack dropStack = itemStack.clone(); + + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, + () -> world.dropItem(location, dropStack) + ); + } } From 32d81cf4ceeb3469fd3484753caab77a31ab4b8c Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 22:06:40 +0200 Subject: [PATCH 4/6] Set proper pickup delay --- .../github/coachluck/backpacksplus/utils/InventoryWatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 65b5414..02aac03 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -181,7 +181,7 @@ private void dropItem(final World world, final Location location, final ItemStac Bukkit.getScheduler().scheduleSyncDelayedTask( plugin, - () -> world.dropItem(location, dropStack) + () -> world.dropItem(location, dropStack, item -> item.setPickupDelay(40)) ); } From 469dc9cf25165203ce7f3c4ac38834bfa186a41d Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 22:14:38 +0200 Subject: [PATCH 5/6] Fix duping prevCount can be larger than limit --- .../github/coachluck/backpacksplus/utils/InventoryWatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 02aac03..5d73dfc 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -117,7 +117,7 @@ public void run() { int prevCount = count; count = count + itemStack.getAmount(); if (count > limit) { - int amountToKeep = limit - prevCount; + int amountToKeep = Math.max(0, limit - prevCount); int difference = itemStack.getAmount() - amountToKeep; removedCount = removedCount + difference; From 479393128f533ea882f74cb458225ba6fafb244f Mon Sep 17 00:00:00 2001 From: BrainStone Date: Tue, 27 Jul 2021 22:24:45 +0200 Subject: [PATCH 6/6] Dropp all items at once --- .../backpacksplus/utils/InventoryWatcher.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java index 5d73dfc..b818db0 100644 --- a/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java +++ b/src/main/java/io/github/coachluck/backpacksplus/utils/InventoryWatcher.java @@ -23,6 +23,8 @@ import io.github.coachluck.backpacksplus.BackPacksPlus; import io.github.coachluck.backpacksplus.api.BackPackUtil; import io.github.coachluck.backpacksplus.utils.lang.MessageKey; +import java.util.LinkedList; +import java.util.List; import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -99,8 +101,7 @@ public void run() { timer++; ItemStack[] items = player.getInventory().getContents(); - Location location = player.getLocation(); - World world = player.getWorld(); + List toDrop = new LinkedList<>(); int count = 0; int removedCount = 0; @@ -124,7 +125,7 @@ public void run() { if (difference > 0) { // Drop item first itemStack.setAmount(difference); - dropItem(world, location, itemStack); + toDrop.add(itemStack.clone()); // Then delete it itemStack.setAmount(amountToKeep); @@ -137,6 +138,14 @@ public void run() { return; } + Location location = player.getLocation(); + World world = player.getWorld(); + + Bukkit.getScheduler().scheduleSyncDelayedTask( + plugin, + () -> toDrop.forEach(dropStack -> world + .dropItem(location, dropStack, item -> item.setPickupDelay(40))) + ); plugin.getMessageService().sendMessage(player, MessageKey.OVER_LIMIT, Integer.toString(removedCount), Integer.toString(limit)); } @@ -174,15 +183,5 @@ private int getLimit(Player player) return rValue.intValue(); } - - private void dropItem(final World world, final Location location, final ItemStack itemStack) - { - final ItemStack dropStack = itemStack.clone(); - - Bukkit.getScheduler().scheduleSyncDelayedTask( - plugin, - () -> world.dropItem(location, dropStack, item -> item.setPickupDelay(40)) - ); - } }