From 339f6cf9147b920c97fb5d9c47c03fd77d0e9045 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Wed, 14 May 2025 10:39:29 +0200 Subject: Fix removing items from inventory on 1.10.2 and lower Closes https://github.com/LMBishop/Quests/issues/780 --- .../hook/versionspecific/VersionSpecificHandler.java | 6 ++++++ .../versionspecific/VersionSpecificHandler11.java | 17 +++++++++++++++++ .../versionspecific/VersionSpecificHandler8.java | 20 ++++++++++++++++++++ .../leonardobishop/quests/bukkit/util/TaskUtils.java | 17 ++++++----------- 4 files changed, 49 insertions(+), 11 deletions(-) (limited to 'bukkit/src') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java index c9d16be5..4dd299d6 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java @@ -20,6 +20,7 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.SmithingInventory; @@ -213,4 +214,9 @@ public interface VersionSpecificHandler { * @see Goat */ boolean isGoat(Entity entity); + + /** + * Reason behind moving it to a version specific handler + */ + int removeItem(Inventory inventory, int slot, int amountToRemove); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java index 3fe31a0b..0563d2cb 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java @@ -7,6 +7,8 @@ import org.bukkit.entity.Mule; import org.bukkit.entity.Player; import org.bukkit.entity.SkeletonHorse; import org.bukkit.entity.ZombieHorse; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements VersionSpecificHandler { @@ -44,4 +46,19 @@ public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements public boolean isPlayerOnZombieHorse(Player player) { return player.getVehicle() instanceof ZombieHorse; } + + @Override + public int removeItem(Inventory inventory, int slot, int amountToRemove) { + ItemStack item = inventory.getItem(slot); + + if (item == null) { + return 0; + } + + int amountInStack = item.getAmount(); + int newAmountInStack = Math.max(0, amountInStack - amountToRemove); + item.setAmount(newAmountInStack); + + return amountInStack - newAmountInStack; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java index 9846a025..d333b5f1 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java @@ -10,6 +10,7 @@ import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; @@ -162,4 +163,23 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { public boolean isGoat(Entity entity) { return false; } + + @Override + public int removeItem(Inventory inventory, int slot, int amountToRemove) { + ItemStack item = inventory.getItem(slot); + + if (item == null) { + return 0; + } + + int amountInStack = item.getAmount(); + int newAmountInStack = Math.max(0, amountInStack - amountToRemove); + item.setAmount(newAmountInStack); + + // It's needed in older versions + // https://github.com/LMBishop/Quests/issues/787 + inventory.setItem(slot, item); + + return amountInStack - newAmountInStack; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java index 20a8354d..2ac6a5de 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java @@ -28,6 +28,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -596,21 +597,15 @@ public class TaskUtils { } public static void removeItemsInSlots(Player player, int[] amountPerSlot, int amountToRemove) { - for (int i = 0; i < 36; i++) { - if (amountPerSlot[i] == 0) continue; - - ItemStack slot = player.getInventory().getItem(i); - if (slot == null) continue; + PlayerInventory inventory = player.getInventory(); - int amountInStack = slot.getAmount(); - int min = Math.max(0, amountInStack - amountToRemove); - slot.setAmount(min); - amountToRemove = amountToRemove - amountInStack; - if (amountToRemove <= 0) break; + for (int i = 0; i < 36 && amountToRemove > 0; i++) { + if (amountPerSlot[i] != 0) { + amountToRemove -= plugin.getVersionSpecificHandler().removeItem(inventory, i, amountToRemove); + } } } - /** * Returns a config validator which checks if at least one value in the given * paths exist. -- cgit v1.2.3-70-g09d2