Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем doodka, 28 окт 2014.

  1. Автор темы
    doodka

    doodka Активный участник Пользователь

    Баллы:
    68
    Skype:
    d_oo_d
    Добрый день!
    Задача: удалить дроп, который содержится в блоке из мода. Проблема в том, что через 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();
                    }
                }
            }
        }
    
    Есть ли более хороший способ это реализовать?
     
    Последнее редактирование: 28 окт 2014
  2. Хостинг MineCraft
    <
  3. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    С таким подходом лагов только прибавится.
    Есть такой вариант: очищать инвентарь блока перед его разрушением.
     
  4. Hilgert

    Hilgert Старожил Пользователь

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    e.setDrop() вроде
     
  5. Автор темы
    doodka

    doodka Активный участник Пользователь

    Баллы:
    68
    Skype:
    d_oo_d
    В BlockBreakEvent нет такого. А block.getDrops().clear() -удаляет только дроп с самого блока.
    Мне нужно удалить вещи, которые хранятся в инвентаре блока из мода (дюп).
     
  6. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    > Мне нужно удалить вещи, которые хранятся в инвентаре блока из мода (дюп).
    Ну так "залезь" в инвентарь блока и удали всё, тогда ничего не выпадет.
     
  7. Автор темы
    doodka

    doodka Активный участник Пользователь

    Баллы:
    68
    Skype:
    d_oo_d
    Так?
    Код:
        @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();
            }
        }
     
    Последнее редактирование: 28 окт 2014
  8. saharin94

    saharin94 Старожил Пользователь Заблокирован

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Как бы так. Только не понимаю, зачем отменять эвент и искусственно ломать блок?
    p.s. Смотри, чтобы из этого не вылился гриф, так как у тебя ни приоритета, ни игнора отменённых эвентов.
     
  9. Автор темы
    doodka

    doodka Активный участник Пользователь

    Баллы:
    68
    Skype:
    d_oo_d
    Убрал отмену. Приоритеты и проверки блоков напишу.
    Спасибо.
     
  10. NaPsTeR

    NaPsTeR Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    А не проще изменить мод и оффнуть в нем дроп или исправить дюп?
     
  11. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Не проще
     
  12. NaPsTeR

    NaPsTeR Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    kesha0129
    Почему?
     
  13. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    1. Работа с говнокодом мода
    2. Лишняя работа по декомпиляции/компиляции/обфускации
    3. Неуниверсальность метода
    4. Необходимость переделки каждой новой выходящей версии мода
     
  14. Jampire

    Jampire Старожил Пользователь

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    При разрушении блока для каждого выпавшего предмета ItemSpawnEvent вызывается. Что делать дальше, думаю, объяснять не стоит? :)
     

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