Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов 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. Хостинг MineCraft
    <
  3. serega6531

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

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

    Astendos Новичок

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

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

    Hо я так понимаю что между посылкой ивента и обработкой должно быть ещё что то, типа запись ивента, и добавление в список ожидающих или что то такое.
     
  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. 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:
     
  18. serega6531

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

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

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

    Баллы:
    173
    Если использовать breakNaturally(), то нет:

    Код:
    //*
    https://github.com/Bukkit/CraftBukkit/blob/master/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
    //*
    
    public boolean breakNaturally() {
            // Order matters here, need to drop before setting to air so skulls can get their data
            net.minecraft.server.Block block = this.getNMSBlock();
            byte data = getData();
            boolean result = false;
    
            if (block != null && block != Blocks.AIR) {
                block.dropNaturally(chunk.getHandle().world, x, y, z, data, 1.0F, 0);
                result = true;
            }
    
            setTypeId(Material.AIR.getId());
            return result;
        }
     

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