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

[решено]Удаление дропа из блока

doodka

Активный участник
Пользователь
Баллы
68
Добрый день!
Задача: удалить дроп, который содержится в блоке из мода. Проблема в том, что через getDrops().clear() удаляется только дроп самого блока, а то, что содержалось в нем-нет.
Если просто изменить тип, то из него вылетают вещи.
Сделал такую очистку:
Код:
    @EventHandler()
    public void onBlockBreak(BlockBreakEvent e)
    {
        if(e.isCancelled()) { return; }
        e.getBlock().breakNaturally();

        List<Entity> entity = e.getBlock().getWorld().getEntities();
        for(Entity ent : entity) {
            if(ent instanceof Item) {
                if (ent.getLocation().distance(e.getBlock().getLocation()) < 2) {
                    ent.remove();
                }
            }
        }
    }

Есть ли более хороший способ это реализовать?
 
Последнее редактирование:
Код:
        List<Entity> entity = e.getBlock().getWorld().getEntities();
        for(Entity ent : entity) {
            if(ent instanceof Item) {
                if (ent.getLocation().distance(e.getBlock().getLocation()) < 2) {
                    ent.remove();
                }
            }
С таким подходом лагов только прибавится.
Есть такой вариант: очищать инвентарь блока перед его разрушением.
 
В BlockBreakEvent нет такого. А block.getDrops().clear() -удаляет только дроп с самого блока.
Мне нужно удалить вещи, которые хранятся в инвентаре блока из мода (дюп).
 
> Мне нужно удалить вещи, которые хранятся в инвентаре блока из мода (дюп).
Ну так "залезь" в инвентарь блока и удали всё, тогда ничего не выпадет.
 
Так?
Код:
    @EventHandler()
    public void onBlockBreak(BlockBreakEvent e)
    {
        if(e.isCancelled()) { return; }

        Block block = e.getBlock();
        if(block.getState() instanceof InventoryHolder) {
            e.setCancelled(true);
            InventoryHolder inventoryHolder = (InventoryHolder) block.getState();
            inventoryHolder.getInventory().clear();
            block.breakNaturally();
        }
    }
 
Последнее редактирование:
Так?
Код:
    @EventHandler()
    public void onBlockBreak(BlockBreakEvent e)
    {
        if(e.isCancelled()) { return; }

        Block block = e.getBlock();
        if(block.getState() instanceof InventoryHolder) {
            e.setCancelled(true);
            InventoryHolder inventoryHolder = (InventoryHolder) block.getState();
            inventoryHolder.getInventory().clear();
            block.breakNaturally();
        }
    }
Как бы так. Только не понимаю, зачем отменять эвент и искусственно ломать блок?
p.s. Смотри, чтобы из этого не вылился гриф, так как у тебя ни приоритета, ни игнора отменённых эвентов.
 
Убрал отмену. Приоритеты и проверки блоков напишу.
Спасибо.
 
  1. Работа с говнокодом мода
  2. Лишняя работа по декомпиляции/компиляции/обфускации
  3. Неуниверсальность метода
  4. Необходимость переделки каждой новой выходящей версии мода
 
При разрушении блока для каждого выпавшего предмета ItemSpawnEvent вызывается. Что делать дальше, думаю, объяснять не стоит? :)
 

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

Назад
Верх