diff --git a/pom.xml b/pom.xml index 88c6395..8360147 100644 --- a/pom.xml +++ b/pom.xml @@ -46,11 +46,11 @@ ${project.name} + org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.11.0 - 1.8 - 1.8 + 17 diff --git a/src/main/java/de/iani/treasurechest/ChestInventoryListener.java b/src/main/java/de/iani/treasurechest/ChestInventoryListener.java index 634bd40..b702859 100644 --- a/src/main/java/de/iani/treasurechest/ChestInventoryListener.java +++ b/src/main/java/de/iani/treasurechest/ChestInventoryListener.java @@ -10,8 +10,11 @@ import java.util.logging.Level; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.ShulkerBox; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -25,6 +28,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; @@ -148,7 +152,7 @@ for (int i = 0; i < priceCount; i++) { temp[i] = payoutEvent.getItems().get(i).clone(); } - if (!clonedPlayerInventory.addItem(temp).isEmpty()) { + if (addItemsToInventory(clonedPlayerInventory, temp) == null) { plugin.sendMessage(player, "Du hast nicht genĂ¼gend Platz in deinem Inventar!", true); return; } @@ -172,7 +176,7 @@ for (int i = 0; i < priceCount; i++) { temp[i] = payoutEvent.getItems().get(i).clone(); } - player.getInventory().addItem(temp); + FilledInventory filledInventory = addItemsToInventory(player.getInventory(), temp); for (ItemStack stack : payoutEvent.getItems()) { StringBuilder t = new StringBuilder(" "); if (stack.getAmount() > 1) { @@ -191,6 +195,9 @@ } plugin.sendMessage(player, t.toString()); } + if (filledInventory == FilledInventory.ShulkerBox) { + plugin.sendMessage(player, "Die Items wurden in eine leere Shulker-Kiste in deinem Inventar gelegt."); + } } int money = payoutEvent.getMoney(); if (money > 0) { @@ -243,4 +250,52 @@ public void onPlayerQuit(PlayerQuitEvent event) { openInventories.remove(event.getPlayer()); } + + private FilledInventory addItemsToInventory(Inventory inventory, ItemStack[] items) { + int itemCount = 0; + for (ItemStack itemStack : items) { + if (itemStack != null && itemStack.getType() != Material.AIR) { + itemCount++; + } + } + + int inventorySpace = 0; + for (ItemStack shulkerItem : inventory.getContents()) { + if (shulkerItem == null || shulkerItem.getType() == Material.AIR) { + inventorySpace++; + } + } + if (inventorySpace >= itemCount) { + inventory.addItem(items); + return FilledInventory.PlayerInventory; + } + + for (ItemStack inventoryItemStack : inventory.getContents()) { + if (inventoryItemStack != null) { + if (inventoryItemStack.getItemMeta() instanceof BlockStateMeta blockStateMeta) { + BlockState blockState = blockStateMeta.getBlockState(); + if (blockState instanceof ShulkerBox shulkerBox) { + ItemStack[] shulkerContents = shulkerBox.getSnapshotInventory().getStorageContents(); + boolean shulkerEmpty = true; + for (ItemStack shulkerItem : shulkerContents) { + if (shulkerItem != null && shulkerItem.getType() != Material.AIR) { + shulkerEmpty = false; + } + } + if (shulkerEmpty) { + shulkerBox.getSnapshotInventory().setStorageContents(items); + blockStateMeta.setBlockState(blockState); + inventoryItemStack.setItemMeta(blockStateMeta); + return FilledInventory.ShulkerBox; + } + } + } + } + } + return null; + } + + private enum FilledInventory { + PlayerInventory, ShulkerBox + } }