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

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

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

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

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

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

    Заранее спасибо :)
     
  2. Хостинг MineCraft
    <
  3. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ручками.
     
    Последнее редактирование: 14 ноя 2016
  4. DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    ItemStack[] drops = e.getDrops();
    e.getDrops().clear();
    player.getInventory().addItem(drops);
    Так как-то, уже не помню
     
  5. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Он дает ссылку..Так:
    ItemStack[] drops = e.getDrops();
    player.getInventory().addItem(drops);
    e.getDrops().clear();
     
  6. DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    ????
     
  7. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    p.getInventory().addItem(e.getDrops());
    e.getDrops().clear();
    ???
     
  8. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    И никто не угадал.

    Код:
        @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);
        }
        
    Пруфит.[DOUBLEPOST=1479238997,1479237793][/DOUBLEPOST]В идеале овердроп в шедулере с центрированием и задержкой в 1 тик, иначе дроп разлетается.

    Код:
        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());
                }
            }
        }
     
    Последнее редактирование: 15 ноя 2016
  9. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    ignoreCancelled чтоб не отрабатывал наш ивент, если отменен где то. Дропает в случае забитого инвентаря. Мы же не хотим пропажу дропа при оверинвентаре.
     
  10. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Тож когда то так нубил :D. Бывает. И я до сих пор не понимаю, что курили создатели ведра.
     
  11. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    false - отрабатывать в любом случае.
    true - отрабатывать если евент НЕ отменен.
    Никогда не пытайся понимать бакит апи логикой.

    [DOUBLEPOST=1479241970,1479241715][/DOUBLEPOST]Если уж пытаться переводит то получается как то так:
    Игнорировать ли отмененый евент? Да/Нет[DOUBLEPOST=1479242077][/DOUBLEPOST]
    Разве бакит не будет дропать предмет если инвентарь переполнен?
     
  12. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Да там все как раз на оборот, это точно.[DOUBLEPOST=1479242130][/DOUBLEPOST]
    Еслиб он дропил, яб надюпился :D. Но увы и ах.
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Ок, проверю. Но тяжесть там желательно ставить.
     
  14. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
     
  15. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Не не варик точно. Я грифанул приват без анотации.
     
  16. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Я вот тоже почемуто помню что дефаулт труе был. Может поменяли что-то в новых версиях .
     
  17. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Память -- весьма ненадёжная штука. Он действительно по умолчанию false на всех версиях, начиная с 1.1.0. Проверил. И приоритет как NORMAL по умолчанию. И порядок запуска по приоритетам: LOWEST>>LOW>>NORMAL>>HIGH>>HIGHEST>>MONITOR.
     
  18. _MediaNik_

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

    Баллы:
    46
    Skype:
    Medianik5
    Имя в Minecraft:
    _MediaNik_
    Ошибка. Либо я кривой, но это у меня всегда крашило сервер..
     

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