Помогите Проверка блока

  • Автор темы Автор темы _Rudey_
  • Дата начала Дата начала

_Rudey_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
RudeyCoolLeet
Как сделать проверку сломанного блока, после чего запретить дроп этого блока и выдать игроку в инвентарь 6 единиц угля.
Пример:
Я сломал угольную руду, и уголь не упал с блока, а попал прямо в инвентарь.

Заранее спасибо :)
 
Ручками.
 
Последнее редактирование:
Как сделать проверку сломанного блока, после чего запретить дроп этого блока и выдать игроку в инвентарь 6 единиц угля.
Пример:
Я сломал угольную руду, и уголь не упал с блока, а попал прямо в инвентарь.

Заранее спасибо :)
ItemStack[] drops = e.getDrops();
e.getDrops().clear();
player.getInventory().addItem(drops);
Так как-то, уже не помню
 
И никто не угадал.

Java:
    @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
    public void on(BlockBreakEvent e) {
        Player p = e.getPlayer();
        Block b = e.getBlock();
        for(ItemStack item : b.getDrops()) {
            HashMap<Integer, ItemStack> over = p.getInventory().addItem(item);
            for(Entry<Integer, ItemStack> entry : over.entrySet()){
                p.getWorld().dropItem(b.getLocation(), entry.getValue());
            }
        }
        if(e.getExpToDrop()!=0) {
            p.giveExp(e.getExpToDrop());
            p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
        }
        b.setType(Material.AIR);
    }
Пруфит.
В идеале овердроп в шедулере с центрированием и задержкой в 1 тик, иначе дроп разлетается.

Java:
    public class Scheduler extends BukkitRunnable {
        Player p;
        ItemStack item;
        Block b;
        Scheduler(Player p, ItemStack item, Block b) {
            this.p = p;
            this.item = item;
            this.b = b;
        }
        @Override
        public void run() {
            HashMap<Integer, ItemStack> over = p.getInventory().addItem(item);
            for(Entry<Integer, ItemStack> entry : over.entrySet()){
                p.getWorld().dropItem(b.getLocation().add(0.5, 0, 0.5), entry.getValue());
            }
        }
    }
 
Последнее редактирование:
ignoreCancelled = true, -- это что такое? Оно поломает все приваты совместно с этим: b.setType(Material.AIR);
Java:
 HashMap<Integer, ItemStack> over = p.getInventory().addItem(item);
for(Entry<Integer, ItemStack> entry : over.entrySet())  p.getWorld().dropItem(b.getLocation(), entry.getValue());
А это что за непонятное? Что значит дропнуть на месте блока из инвентаря то, что туда было только что положено? Зачем это автору, если он просит добавить в инвентарь, а не сделать дроп? Реализация того, что не нужно, просто безумная.
ignoreCancelled чтоб не отрабатывал наш ивент, если отменен где то. Дропает в случае забитого инвентаря. Мы же не хотим пропажу дропа при оверинвентаре.
 
Java:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
ignore -- игнорировать, Cancelled -- отмену, true -- да. Значит если событие было отменено -- всё равно обробатывать событие.
Тож когда то так нубил :D. Бывает. И я до сих пор не понимаю, что курили создатели ведра.
 
ignore -- игнорировать, Cancelled -- отмену, true -- да. Значит если событие было отменено -- всё равно обробатывать событие.
false - отрабатывать в любом случае.
true - отрабатывать если евент НЕ отменен.
Никогда не пытайся понимать бакит апи логикой.

If ignoreCancelled is true and the event is cancelled, the method is not called. Otherwise, the method is always called.

Если уж пытаться переводит то получается как то так:
Игнорировать ли отмененый евент? Да/Нет
Дропает в случае забитого инвентаря. Мы же не хотим пропажу дропа при оверинвентаре.
Разве бакит не будет дропать предмет если инвентарь переполнен?
 
false - отрабатывать в любом случае.
true - отрабатывать если евент НЕ отменен.
Никогда не пытайся понимать бакит апи логикой.


Если уж пытаться переводит то получается как то так:
Игнорировать ли отмененый евент? Да/Нет
Да там все как раз на оборот, это точно.
false - отрабатывать в любом случае.
true - отрабатывать если евент НЕ отменен.
Никогда не пытайся понимать бакит апи логикой.


Если уж пытаться переводит то получается как то так:
Игнорировать ли отмененый евент? Да/Нет

Разве бакит не будет дропать предмет если инвентарь переполнен?
Еслиб он дропил, яб надюпился :D. Но увы и ах.
 
Не не варик точно. Я грифанул приват без анотации.
 
Я вот тоже почемуто помню что дефаулт труе был. Может поменяли что-то в новых версиях .
Память -- весьма ненадёжная штука. Он действительно по умолчанию false на всех версиях, начиная с 1.1.0. Проверил. И приоритет как NORMAL по умолчанию. И порядок запуска по приоритетам: LOWEST>>LOW>>NORMAL>>HIGH>>HIGHEST>>MONITOR.
 
Назад
Верх