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

В разработке Очистка дропа BlockBreakEvent

Тема в разделе "Разработка плагинов для новичков", создана пользователем Jampire, 9 июл 2013.

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

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Понадобилось очистить дроп с блоков. Перерыл весь форум баккита, видел только 2 способа.

    1. Отмена эвента, изменение типа блока на AIR.
    2. event.getBlock().getDrops().clear(); - уже не работает.

    1 способ убог, ибо с ним будут проблемы с другими плагинами.
    2 без комментариев.

    Так вот, нужен 3й способ. Получилось у кого-то решить данную задачу?


    Ission, fromgate и больше не знает :(
     
  2. Хостинг MineCraft
    <
  3. Автор темы
    Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Прискорбно, видел тебя на бакките. В этих темах)
     
  4. BeYkeR

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

    Баллы:
    173
    Мб этот подойдет ? Код выдрал с HockeyGame
    Код:
              for (Entity x : event.getPlayer().getNearbyEntities(1, 1, 1)) {
                    if (!(x instanceof Item))
                      return;
                      x.remove();
    }
    Я еще не проверял на деле т.к. это немного измененный код,и это просто теория.
     
  5. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Учитывая, что дроп блока берётся напрямую из этого куска:
    Код:
    public int getDropType(int i, Random random, int j) {
            return this.id;
        }
    , то стандартными спсобами никак. Только жуткими костылями.[DOUBLEPOST=1373372175,1373371242][/DOUBLEPOST]Можно использовать такое адское извращение:
    Код:
        @EventHandler
        public void onBB(BlockBreakEvent e)
        {
            e.getPlayer().setMetadata("Break", new FixedMetadataValue(plugin, e.getBlock().getDrops()));
        }
        @EventHandler
        public void onIS(ItemSpawnEvent e)
        {
            for(Entity ent: e.getEntity().getNearbyEntities(10, 10, 10))
            {
                boolean breakI = false;
                if(ent instanceof Player)
                {
                    if(!((Player)ent).getMetadata("Break").isEmpty())
                    {
                        List<MetadataValue> metadata = ((Player)ent).getMetadata("Break");
                        for(MetadataValue mv: metadata)
                        {
                            Collection<ItemStack> cis = (Collection<ItemStack>) mv.value();
                            for(ItemStack is: cis)
                                if(e.getEntity().getItemStack().equals(is))
                                {
                                    breakI = true;
                                    e.setCancelled(true);
                                    break;
                                }
                            if(breakI)break;
                        }
                        if(breakI)  ((Player)ent).removeMetadata("Break", plugin);
                    }
                }
                if(breakI)break;
            }
        }
    Оно работает, но извращение.
     
    DixyOxx и Jampire нравится это.
  6. Автор темы
    Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    знатный костыль. Я тоже думал ловить момент спауна предмета и пытаться именно его отменить.
    Будем использовать костыль, пока нет аналогов. Благодарю :)
     
  7. Iggi

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

    Баллы:
    103
    Имя в Minecraft:
    iggi666
    Прошел почти год и я подниму тему :O
    Пытаюсь очистить дроп от верстака из мода.
    Ни один из вариантов не работает, даже третий) Содержимое все равно падает и упорно не хочет исчезать. Сам ItemSpawnEvent вызывается, но спавн не отменяется.
     
    Tarock12 и KoBoT нравится это.
  8. saharin94

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

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Я делал подобное, когда дюп с трбами из билда был актуален. Просто отменял эвент, ломал блок с помощью breakNaturally() и удалял весь дроп, что лежит рядом (игрок его увидит, но подобрать не успеет).
    p.s. Недостаток: из-за отмены события плагины ведения логов не увидят разрушение блока.
     
  9. kirill2011s

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

    Баллы:
    103
    Ну можно послать собственный event, если уж сильно надо.
     
  10. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Я конечно может очень глупый...
    Но почему не /gamerule doTileDrops false?
     
  11. Iggi

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

    Баллы:
    103
    Имя в Minecraft:
    iggi666
    Это вроде отключить весь дроп, а мне надо только с дюпающего верстака
     
    KoBoT нравится это.
  12. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Вместо отмены попробуй получит сущность предмета и удалить соответствующим методом
     
  13. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Можно отключить тайлдроппы, а затем дропать только с того что надо.
     
  14. Hilgert

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

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    e.setCancelled(true);
    e.getBlock().breakNaturally(new ItemStack(Material.AIR));
     
  15. saharin94

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

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Тогда нет смысла отменять эвент.
     
    Tarock12 нравится это.
  16. Iggi

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

    Баллы:
    103
    Имя в Minecraft:
    iggi666
    Если этот блок верстак, содержимое все равно будет выпадать
     
    KoBoT нравится это.
  17. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    А если инвентарь нестандартный, то содержимое придется получать рефлексиями
     
  18. pizzlywizzly

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

    Баллы:
    123
    А обязательно приоритет самый высокий держать у лиснера?
     
  19. Hilgert

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

    Баллы:
    123
    Skype:
    mixa2258
    Имя в Minecraft:
    Hilgert
    если не отменять - дроп будет
     
  20. pizzlywizzly

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

    Баллы:
    123
    Разве не считается правилом хорошего тона использовать самый высокий приоритет только у логгеров?
     
  21. saharin94

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

    Баллы:
    173
    Skype:
    RikkiLooh
    Имя в Minecraft:
    RubukkitDniwe
    Очень плохой тон. Тогда плагины логов будут ловить события, которые в дальнейшем будут отменены (например, попытки разрушения привата). А так эти плагины ставятся в очередь самыми последними, тогда отменённые события до них просто не доходят.
     

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