!player.getInventory().getItemInOffHand().isSimilar(item))
package me.artix001.shulkerpacks;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.persistence.PersistentDataType;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class BackPackInventory implements Listener {
private static final Map<UUID, Inventory> backpacks = new HashMap<>();
private static final Map<UUID, ItemStack> openedShulkers = new HashMap<>();
private static final NamespacedKey BACKPACK_LEVEL_KEY = new NamespacedKey(ShulkerPacks.getInstance(), "backpackLevel");
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
} else if (event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
handleClick(event, event.getPlayer().getInventory().getItemInMainHand());
handleClick(event, event.getPlayer().getInventory().getItemInOffHand());
}
}
private void handleClick(PlayerInteractEvent event, ItemStack item) {
if (isBackpack(item)) {
event.setCancelled(true);
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
if (item.isSimilar(event.getPlayer().getInventory().getItemInMainHand())) {
openBackpack(event.getPlayer(), item);
}
}
}
}
private void openBackpack(Player player, ItemStack item) {
int level = getBackpackLevel(item);
UUID uuid = player.getUniqueId();
Inventory backpack = backpacks.computeIfAbsent(uuid, k -> Bukkit.createInventory(null, getInventorySize(level), "Рюкзак"));
loadItemsFromShulker(item, backpack);
player.openInventory(backpack);
openedShulkers.put(uuid, item); // Сохраняем ссылку на шалкеровый ящик
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
Player player = (Player) event.getPlayer();
UUID uuid = player.getUniqueId();
if (backpacks.containsKey(uuid)) {
ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
if (isBackpack(item) && player.getInventory().containsAtLeast(item, 1)) {
saveItemsToShulker(item, backpacks.get(uuid));
}
backpacks.remove(uuid);
openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
}
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
handleInventoryEvent(event);
}
@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
handleInventoryEvent(event);
}
private void handleInventoryEvent(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
UUID uuid = player.getUniqueId();
if (backpacks.containsKey(uuid)) {
ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
if (!isBackpack(item) || !player.getInventory().containsAtLeast(item, 1)) {
event.setCancelled(true);
player.closeInventory();
backpacks.remove(uuid);
openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
} else {
ItemStack clickedItem = event.getCurrentItem();
if (isShulkerBox(clickedItem) || isShulkerBox(event.getCursor())) {
event.setCancelled(true);
}
// Проверка на -1 перед тем, как пытаться получить предмет из горячей клавиши
int hotbarButton = event.getHotbarButton();
if (hotbarButton != -1) {
ItemStack hotbarItem = player.getInventory().getItem(hotbarButton);
if (isShulkerBox(hotbarItem)) {
event.setCancelled(true);
}
}
}
}
}
private void handleInventoryEvent(InventoryDragEvent event) {
Player player = (Player) event.getWhoClicked();
UUID uuid = player.getUniqueId();
if (backpacks.containsKey(uuid)) {
ItemStack item = openedShulkers.get(uuid); // Получаем шалкеровый ящик, который был открыт
if (!isBackpack(item) || !player.getInventory().containsAtLeast(item, 1)) {
event.setCancelled(true);
player.closeInventory();
backpacks.remove(uuid);
openedShulkers.remove(uuid); // Удаляем ссылку на шалкеровый ящик
} else {
ItemStack draggedItem = event.getOldCursor();
if (isShulkerBox(draggedItem)) {
event.setCancelled(true);
}
}
}
}
private boolean isBackpack(ItemStack item) {
return item != null && item.getType().name().endsWith("_SHULKER_BOX") && item.hasItemMeta() && item.getItemMeta().getPersistentDataContainer().has(BACKPACK_LEVEL_KEY, PersistentDataType.INTEGER);
}
private boolean isShulkerBox(ItemStack item) {
return item != null && (item.getType().name().endsWith("_SHULKER_BOX") || item.getType() == org.bukkit.Material.SHULKER_BOX);
}
private int getBackpackLevel(ItemStack item) {
return item.getItemMeta().getPersistentDataContainer().get(BACKPACK_LEVEL_KEY, PersistentDataType.INTEGER);
}
private int getInventorySize(int level) {
switch (level) {
case 1:
return 9;
case 2:
return 18;
case 3:
return 27;
default:
return 9;
}
}
private void loadItemsFromShulker(ItemStack shulker, Inventory inventory) {
BlockStateMeta meta = (BlockStateMeta) shulker.getItemMeta();
org.bukkit.block.ShulkerBox shulkerBox = (org.bukkit.block.ShulkerBox) meta.getBlockState();
Inventory shulkerInventory = shulkerBox.getInventory();
for (int i = 0; i < inventory.getSize(); i++) {
inventory.setItem(i, i < shulkerInventory.getSize() ? shulkerInventory.getItem(i) : null);
}
}
private void saveItemsToShulker(ItemStack shulker, Inventory inventory) {
BlockStateMeta meta = (BlockStateMeta) shulker.getItemMeta();
org.bukkit.block.ShulkerBox shulkerBox = (org.bukkit.block.ShulkerBox) meta.getBlockState();
Inventory shulkerInventory = shulkerBox.getInventory();
for (int i = 0; i < inventory.getSize(); i++) {
if (i < shulkerInventory.getSize()) {
shulkerInventory.setItem(i, inventory.getItem(i));
}
}
shulkerBox.update();
meta.setBlockState(shulkerBox);
shulker.setItemMeta(meta);
}
}
вот просто напросто полный код. возможно, я вообще что то не то скинул