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
+ }
}