Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Удаление предметов в инвентаре

Korvinius

Активный участник
Пользователь
Баллы
88
Здравствуйте, пытаюсь запретить перемещать некоторые предметы в инвентаре, если сказать конкретнее, то нужно, чтобы при попытке переложить что то в инвентаре, это что то удалялось.

Пробовал отменить событие:
Java:
event.setCancelled(true);

если событие в инвентаре игрока, то работает отлично, но, если в инвентаре сундука, наковальни или чего либо другого, то этот предмет забирается из инвентаря и бросается на землю, а мне нужно его полное удаление.

Пробовал такой вариант:
Java:
event.getInventory().remove(event.getCursor());

в этом случае действия трудно предсказуемые, или не удаляется ничего, или удаляется остаток в слоте из которого взят предмет, или удаляются все аналогичные предметы в инвентаре. А мне нужно только убрать то, что только что положено в слот.

Еще пробовал это:
Java:
event.getInventory().clear(event.getSlot());

вообще ничего не происходит, хотя номер слота определяется.

Подскажите пожалуйста в какой стороне искать решение))
 
Последнее редактирование:
JavaScript:
    @SuppressWarnings("deprecation")
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onClick(InventoryClickEvent e) {

        ItemStack is = e.getCurrentItem();
        Player p = (Player) e.getWhoClicked();

        if(is != null && is.getType() == Material.COMMAND){
            e.setCancelled(true);
            e.setCurrentItem(null);
            p.sendMessage("Этот предмет запрещен(2)");
            p.updateInventory();
        }

    }
 
JavaScript:
    @SuppressWarnings("deprecation")
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onClick(InventoryClickEvent e) {

        ItemStack is = e.getCurrentItem();
        Player p = (Player) e.getWhoClicked();

        if(is != null && is.getType() == Material.COMMAND){
            e.setCancelled(true);
            e.setCurrentItem(null);
            p.sendMessage("Этот предмет запрещен(2)");
            p.updateInventory();
        }

    }
к сожалению этот код ничего не меняет.

Пошел другим путем, не знаю, правильно или нет, создал еще один @EventHandler, в итоге получилось типа так:
Java:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent event){
// *********
     event.setCancelled(true);
}
    @EventHandler
    public void onPlayerDropItem(PlayerDropItemEvent event){
// *********
     event.setCancelled(true);
}
вроде как работает, но пока на этапе теста.
 
JavaScript:
    @SuppressWarnings("deprecation")
    @EventHandler(priority = EventPriority.HIGHEST)
    public void onClick(InventoryClickEvent e) {

        ItemStack is = e.getCurrentItem();
        Player p = (Player) e.getWhoClicked();

        if(is != null && is.getType() == Material.COMMAND){
            e.setCancelled(true);
            e.setCurrentItem(null);
            p.sendMessage("Этот предмет запрещен(2)");
            p.updateInventory();
        }

    }

Странно. Этот код работает прекрасно, удаляя коммандный блок из инвентаря при любом взаимодействии с ним.
 
Странно. Этот код работает прекрасно, удаляя коммандный блок из инвентаря при любом взаимодействии с ним.
а вы замените командный блок на что нибудь другое, например Material.DIAMOND и проверьте, в результате действий минимум...
 
а вы замените командный блок на что нибудь другое, например Material.DIAMOND и проверьте, в результате действий минимум...
Минимум - в какой смысле? Проверил, все прекрасно заменяется без проблем.
 
Минимум - в какой смысле? Проверил, все прекрасно заменяется без проблем.
Все работает в инвентаре сундука, наковальни (другие не пробовал), но в инвентаре игрока, сообщение в чат выводится, а предмет не изымается, то есть, остается возможность перемещать запрещенные предметы в своем инвентаре.
такой же вариант, в "левых" инвентарях работает, а в инвентаре игрока нет.

Но все равно спасибо за советы, теперь я примерно представляю, как мне это можно скомбинировать, чтобы получить желаемый результат.


И еще один вопросик, а если метод "устаревший", то есть "deprecation", это очень страшно? Ну в смысле, по логике, если устаревший, то рано или поздно перестанет работать, или нет?
 
Все работает в инвентаре сундука, наковальни (другие не пробовал), но в инвентаре игрока, сообщение в чат выводится, а предмет не изымается, то есть, остается возможность перемещать запрещенные предметы в своем инвентаре.

такой же вариант, в "левых" инвентарях работает, а в инвентаре игрока нет.

Но все равно спасибо за советы, теперь я примерно представляю, как мне это можно скомбинировать, чтобы получить желаемый результат.


И еще один вопросик, а если метод "устаревший", то есть "deprecation", это очень страшно? Ну в смысле, по логике, если устаревший, то рано или поздно перестанет работать, или нет?
По поводу устаревшего метода - да, это предупреждение разработчикам о том, что метод в будущем будет убран или не будет работать. По поводу инвентаря, возможно я чего-то не понимаю, но в инвентаре игрока также все исчезает и заменяется и предмет переместить в другой слот даже не получается.
 
Последнее редактирование:
такой же вариант, в "левых" инвентарях работает, а в инвентаре игрока нет.
Если не ошибаюсь, то такое происходит только в креативе.
И еще один вопросик, а если метод "устаревший", то есть "deprecation", это очень страшно? Ну в смысле, по логике, если устаревший, то рано или поздно перестанет работать, или нет?
Устаревшие методы, как уже выше сказано, должны быть удалены в будущем. Однако из всех Deprecated, которые я знаю, не работает ничего в классе дверей, а так на протяжении долгого времени тот же updateInventory работает без перебоев, хотя он уже давно был отмечен устаревшим. Ну и в свете последних событий удалять устаревшие методы уже некому :)
 

Поделиться этой страницей

Назад
Верх