Вопрос Запрет на перемещения менюшки горячими клавишами

Версия Minecraft
1.20.X

KNOVME

Пользователь
Сообщения
11
Я делаю меню, мне надо запретить переместить его в любые слоты другие слоты, он всегда должен стоять на 1 слоте (0), что я только не пробовал, но с помощью гарячих клавиш 1-9, я все равно могу его перемещать, уже не знаю что мне делать.

Java:
    @EventHandler
    public void onPlayerDropItem(PlayerDropItemEvent event) {
        ItemStack itemDrop = event.getItemDrop().getItemStack();
        if (isProtectedItem(itemDrop)) {
            event.setCancelled(true);
        }
    }

    @EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        Player player = (Player) event.getWhoClicked();
        ItemStack currentItem = event.getCurrentItem();

        if (isProtectedItem(currentItem)) {
            if (event.getClick() == ClickType.NUMBER_KEY) {
                int destinationSlot = event.getHotbarButton();
                int sourceSlot = event.getSlot();
                if (sourceSlot == 0 || destinationSlot == 0) {
                    event.setCancelled(true);
                    player.updateInventory();
                    player.closeInventory();
                }
            }
        }
    }

    @EventHandler
    public void onInventoryDrag(InventoryDragEvent event) {
        for (ItemStack item : event.getNewItems().values()) {
            if (isProtectedItem(item)) {
                event.setCancelled(true);
                break;
            }
        }
    }

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        Player player = event.getPlayer();
        if (player.getWorld().getName().equals("world")) {
            boolean hasModeSelector = false;
            for (ItemStack item : player.getInventory()) {
                if (item != null && item.getType() == Material.PLAYER_HEAD) {
                    ItemMeta meta = item.getItemMeta();
                    if (meta != null && meta.hasDisplayName() && meta.getDisplayName().equals("Выбрать режим")) {
                        hasModeSelector = true;
                        break;
                    }
                }
            }
            if (!hasModeSelector) {
                giveModeSelector(player);
            }
        }
    }

    private void giveModeSelector(Player player) {
        ItemStack playerHead = new ItemStack(Material.PLAYER_HEAD);
        SkullMeta skullMeta = (SkullMeta) playerHead.getItemMeta();

        if (skullMeta != null) {
            GameProfile profile = new GameProfile(UUID.randomUUID(), "");
            profile.getProperties().put("textures", new Property("textures", "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzY5MTk2YjMzMGM2Yjg5NjJmMjNhZDU2MjdmYjZlY2NlNDcyZWFmNWM5ZDQ0Zjc5MWY2NzA5YzdkMGY0ZGVjZSJ9fX0="));

            try {
                Field profileField = skullMeta.getClass().getDeclaredField("profile");
                profileField.setAccessible(true);
                profileField.set(skullMeta, profile);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }

            skullMeta.setDisplayName("Выбрать режим");
            skullMeta.getCustomTagContainer().setCustomTag(new NamespacedKey(plugin, "no-drop"), ItemTagType.BYTE, (byte) 1);
            playerHead.setItemMeta(skullMeta);

            player.getInventory().setItem(0, playerHead);
        }
    }

    private boolean isProtectedItem(ItemStack item) {
        if (item != null && item.getType() == Material.PLAYER_HEAD) {
            ItemMeta meta = item.getItemMeta();
            return meta != null && meta.getCustomTagContainer().hasCustomTag(new NamespacedKey(plugin, "no-drop"), ItemTagType.BYTE);
        }
        return false;
    }
}



Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Решение
Сначала сделай проверку на destination slot == 0 > отмена
а потом уже делай проверку с currentItem и sourceSlot, так как в случае клика цифрой, currentItem может являться другим предметом и твой не проверяется
Сначала сделай проверку на destination slot == 0 > отмена
а потом уже делай проверку с currentItem и sourceSlot, так как в случае клика цифрой, currentItem может являться другим предметом и твой не проверяется
 
Назад
Сверху Снизу