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

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

Jampire

Старожил
Пользователь
Баллы
173
Имя в Minecraft
Jampire
Понадобилось очистить дроп с блоков. Перерыл весь форум баккита, видел только 2 способа.

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

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

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


Ission, fromgate и больше не знает :(
 
пока - только первый метод. второй был введен по моему тикету, но его отметили потому, что не смогли добавить до очередного релиза. но есть надежда — пару дней назад у этого этикета подняли приоритет, значит есть надежда, что он скоро будет возвращен
пока - только первый метод. второй был введен по моему тикету, но его отметили потому, что не смогли добавить до очередного релиза. но есть надежда — пару дней назад у этого этикета подняли приоритет, значит есть надежда, что он скоро будет возвращен
 
пока - только первый метод. второй был введен по моему тикету, но его отметили потому, что не смогли добавить до очередного релиза. но есть надежда — пару дней назад у этого этикета подняли приоритет, значит есть надежда, что он скоро будет возвращен
пока - только первый метод. второй был введен по моему тикету, но его отметили потому, что не смогли добавить до очередного релиза. но есть надежда — пару дней назад у этого этикета подняли приоритет, значит есть надежда, что он скоро будет возвращен

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

Я еще не проверял на деле т.к. это немного измененный код,и это просто теория.
 
Понадобилось очистить дроп с блоков. Перерыл весь форум баккита, видел только 2 способа.

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

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

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


Ission, fromgate и больше не знает :(
Учитывая, что дроп блока берётся напрямую из этого куска:
Код:
public int getDropType(int i, Random random, int j) {
        return this.id;
    }
, то стандартными спсобами никак. Только жуткими костылями.
Можно использовать такое адское извращение:
Код:
    @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;
        }
    }
Оно работает, но извращение.
 
Учитывая, что дроп блока берётся напрямую из этого куска:
Код:
public int getDropType(int i, Random random, int j) {
        return this.id;
    }
, то стандартными спсобами никак. Только жуткими костылями.
Можно использовать такое адское извращение:
Код:
    @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;
        }
    }
Оно работает, но извращение.

знатный костыль. Я тоже думал ловить момент спауна предмета и пытаться именно его отменить.
Будем использовать костыль, пока нет аналогов. Благодарю :)
 
Прошел почти год и я подниму тему :O
Пытаюсь очистить дроп от верстака из мода.
Ни один из вариантов не работает, даже третий) Содержимое все равно падает и упорно не хочет исчезать. Сам ItemSpawnEvent вызывается, но спавн не отменяется.
 
Прошел почти год и я подниму тему :O
Пытаюсь очистить дроп от верстака из мода.
Ни один из вариантов не работает, даже третий) Содержимое все равно падает и упорно не хочет исчезать. Сам ItemSpawnEvent вызывается, но спавн не отменяется.
Я делал подобное, когда дюп с трбами из билда был актуален. Просто отменял эвент, ломал блок с помощью breakNaturally() и удалял весь дроп, что лежит рядом (игрок его увидит, но подобрать не успеет).
p.s. Недостаток: из-за отмены события плагины ведения логов не увидят разрушение блока.
 
Я делал подобное, когда дюп с трбами из билда был актуален. Просто отменял эвент, ломал блок с помощью breakNaturally() и удалял весь дроп, что лежит рядом (игрок его увидит, но подобрать не успеет).
p.s. Недостаток: из-за отмены события плагины ведения логов не увидят разрушение блока.

Ну можно послать собственный event, если уж сильно надо.
 
Прошел почти год и я подниму тему :O
Пытаюсь очистить дроп от верстака из мода.
Ни один из вариантов не работает, даже третий) Содержимое все равно падает и упорно не хочет исчезать. Сам ItemSpawnEvent вызывается, но спавн не отменяется.
Вместо отмены попробуй получит сущность предмета и удалить соответствующим методом
 
Можно отключить тайлдроппы, а затем дропать только с того что надо.
 
e.setCancelled(true);
e.getBlock().breakNaturally(new ItemStack(Material.AIR));
 
А если в процессе события проверять наличие в верстаке предметов и очищать их? По идее в этот момент они ещё не дропнуты, т.е. присутствуют в инвентаре, в слотах, в виде ItemStack?
 
А если в процессе события проверять наличие в верстаке предметов и очищать их? По идее в этот момент они ещё не дропнуты, т.е. присутствуют в инвентаре, в слотах, в виде ItemStack?
А если инвентарь нестандартный, то содержимое придется получать рефлексиями
 
pizzlywizzly, приоритет определяет порядок обработки. Т.е. если у Вашего обработчика приоритет минимальный и вы производите какие-то действия с дропом (или даже отменяете события), то другой плагин, у которого более высокий приоритет у обработчика, также может произвести манипуляции с тем же дропом и, допустим, снова восстановить отмененное событие.
Т.е. кто последний - тот может перечеркнуть действия предыдущих.
 

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

Назад
Верх