1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

new BlockBreakEvent

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

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

    Astendos Новичок

    Баллы:
    16
    Имя в Minecraft:
    ADMAstend
    Здравствуйте.
    Не могу понять почему не хочет срабатывать ивент разрушения блока
    Код:
    @EventHandler
        public void onBlockDamageEvent(BlockDamageEvent e) {
            new BlockBreakEvent(e.getBlock(), e.getPlayer());
            e.getPlayer().sendMessage("Блок: "+e.getBlock().getType()+" разрушен.");
        }
    Сообщение в чат пишет! Но блок не разрушается.

    Пробовал также сделать так:
    Код:
        public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
               Player player = (Player)sender;
               new BlockDamageEvent(player, player.getTargetBlock(null, 200), player.getItemInHand(), true);
               return true;
        }
        @EventHandler
        public void onBlockDamageEvent(BlockDamageEvent e) {
            e.setInstaBreak(true);
        }
    блок всё равно не разрушается.

    Могу только предположить, что нужно эти "новые" ивенты добавить в какой то handler!?
    Буду рад помощи.

    P.S. не ругайте сильно это мой первый пост :rolleyes:
     
  2. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А почему он должен разрушаться? Вы же не разрушаете его, а только посылаете ивент.
    А нет, не посылаете, просто создаёте.
     
  3. Автор темы
    Astendos

    Astendos Новичок

    Баллы:
    16
    Имя в Minecraft:
    ADMAstend
    По сути сервер, должен обработать этот ивент , а поскольку ивент сам по себе называется Block Break то логично что блок должен уничтожиться.

    если плохой пример с BlockBreak то смотри BlockDamageEvent, я его даже сам отлавливаю, и там же вручную прописал уничтожить блок.

    Hо я так понимаю что между посылкой ивента и обработкой должно быть ещё что то, типа запись ивента, и добавление в список ожидающих или что то такое.
     
  4. Bars

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

    Баллы:
    173
    Что за блок хоть? Или со всеми не работает?
     
  5. Автор темы
    Astendos

    Astendos Новичок

    Баллы:
    16
    Имя в Minecraft:
    ADMAstend
    :confused: а какая разница? если для тебя это играет значение, тогда ммм... давай пусть будет стандартный Material.STONE :)
     
  6. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Ивенты обрабатывают плагины. Правда вы его не посылаете. По сути, код не делает ничего, кроме вывода сообщения. Советую вам почитать уроки по Bukkit API.
     
  7. aceJKE

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

    Баллы:
    123
    Может не зарегистрирован event ? Или нету implements Listener ?
     
  8. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Да ивент то тут при чём? Ему блок разрушить нужно!
     
  9. aceJKE

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

    Баллы:
    123
    У него в самом первом сообщении эвент есть...
     
  10. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Он думает, что блоки надо разрушать ивентами. У него срабатывает ивент, но по сути, кроме отсылки сообщения, он ничего не делает.
     
    aceJKE нравится это.
  11. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Эвент это отклик на событие, которое уже произошло или вот-вот произойдёт. Можно провести аналог -- например газета. В первом случае вы видите о том, что какое-то событие произошло и реагируете на это или не реагируете, это ваше право и вы не обязаны кого-то уведомлять, что вдесятером пойдёте и ограбите ювелирный.
    В данном случае нужно самому разбить блок, а не уведомлять о том, что вы собираетесь это сделать.
     
    serega6531 нравится это.
  12. Автор темы
    Astendos

    Astendos Новичок

    Баллы:
    16
    Имя в Minecraft:
    ADMAstend
    Ладно переформулирую вопрос:
    Мне нужно:
    - разбить блок с одного удара.
    - получить с него дроп
    - удалить из инструмента 1 пункт стойкости
    - добавить в статистику игрока этот блок (в клиенте)
    помимо этого:
    - все установленные плагины должны сработать

    и я хочу вместо того что бы прописывать все эти функции заного делать какието проверки и изобретать велосипед я просто хочу послать действие/емуляцию типа игрок розбил блок.
    я теряюсь как еще объяснить.

    если вы думаете что мне нужно что то типа этого:
    Код:
                World world = player.getWorld();
                world.getBlockAt(x,y,z).breakNaturally();

    или типа этого:
    Код:
    player.getTargetBlock(null, 200).breakNaturally();
    вы ошибетесь!
     
  13. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Нельзя.
     
  14. Ission

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

    Баллы:
    173
    Skype:
    lokivava
    Убери через NMS прочность блока до нулевой, но это будет работать на всех и сразу.
     
  15. Автор темы
    Astendos

    Astendos Новичок

    Баллы:
    16
    Имя в Minecraft:
    ADMAstend
    Нельзя только силой мысли вещи создавать всё остальное можно.
    Как минимум сам клиент посылает какой то пакет серверу мол блок разбил.
     
  16. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    Это-то конечно, как бы сервер тогда узнавал о действиях клиента?
     
  17. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Совсем один в один наверное не получится, но:
    1. Создаем и запускаем BlockBreakEvent
    2. Если его не отменили, то breakNaturally (там кажется был метод, в котором можно было указывать предмет, которым разбивали блок)
    3. Уменьшаете прочность предмета
    4. Насчет статистики не знаю - не разбирался, но вроде как она сейчас на сервере, потому наверняка что-то можно придумать.
    5. Событие будет обработано другими плагинами (NoCheatPlus скорее всего ругнётся, если расстояние до блока большое) и если там приват или плагину ещё по каким-то причинам нельзя ломать блок - событие будет отменено (и тогда Вам не нужно выполнять п.2-4)'

    Я понимаю, что Вы хотите. Но это не изобретение велосипеда. Это езда на нём. Это предусмотрено API. Всё остальное (лезть в NMS, пакеты) лучше делать в крайних случаях: сокращает срок жизни плагина (до следующей версии ;))

    Есть пакет PacketPlayInBlockDig. Он по идее приходит от клиента. Можно ли с самого сервера проэмулировать поступление такого пакета, я не знаю — мне как правило нужно либо обработать уже поступивший пакет от клиента или отправить пакет клиенту. Скорее всего посредством ProtocolLib эту задачу решить можно. Но... если Вам нужна одна эта функция, то считайте, что Вы поехали на танке по велосипедной дорожке.
     
    serega6531 нравится это.
  18. Bars

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

    Баллы:
    173
    Поломка с одного удара? А чем не угодил PlayerInteractEvent и проверка на левый клик?
    Кстати, такая возможность предусмотрена в WorldEdit (команда //).
     
  19. BeYkeR

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

    Баллы:
    173
    PHP:
    @EventHandler
        
    public void onBlockDamageEvent(BlockDamageEvent e) {
    //Вызываем событие разрушения блока
    BlockBreakEvent event = new BlockBreakEvent(e.getBlock(), e.getPlayer());
    Bukkit.getPluginManager.callEvent(event);
    if(!
    event.isCancelled){
      
    //Ломаем короч
    e.getBlock().breakNaturally());
            
    e.getPlayer().sendMessage("Блок: "+e.getBlock().getType()+" разрушен.");
    }
        }
    Я сижу с телефона, могут быть небольшие ошибки.:rolleyes:
     
  20. serega6531

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

    Баллы:
    173
    Skype:
    shkurovs
    А что, BlockBreakEvent не вызывается при ломании блока плагином?
     

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