new BlockBreakEvent

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:
 
А почему он должен разрушаться? Вы же не разрушаете его, а только посылаете ивент.
А нет, не посылаете, просто создаёте.
 
По сути сервер, должен обработать этот ивент , а поскольку ивент сам по себе называется Block Break то логично что блок должен уничтожиться.

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

Hо я так понимаю что между посылкой ивента и обработкой должно быть ещё что то, типа запись ивента, и добавление в список ожидающих или что то такое.
 
Что за блок хоть? Или со всеми не работает?
 
По сути сервер, должен обработать этот ивент , а поскольку ивент сам по себе называется Block Break то логично что блок должен уничтожиться.

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

Hо я так понимаю что между посылкой ивента и обработкой должно быть ещё что то, типа запись ивента, и добавление в список ожидающих или что то такое.
Ивенты обрабатывают плагины. Правда вы его не посылаете. По сути, код не делает ничего, кроме вывода сообщения. Советую вам почитать уроки по Bukkit API.
 
Может не зарегистрирован event ? Или нету implements Listener ?
 
У него в самом первом сообщении эвент есть...
Он думает, что блоки надо разрушать ивентами. У него срабатывает ивент, но по сути, кроме отсылки сообщения, он ничего не делает.
 
Здравствуйте.
Не могу понять почему не хочет срабатывать ивент разрушения блока
Код:
@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:
Эвент это отклик на событие, которое уже произошло или вот-вот произойдёт. Можно провести аналог -- например газета. В первом случае вы видите о том, что какое-то событие произошло и реагируете на это или не реагируете, это ваше право и вы не обязаны кого-то уведомлять, что вдесятером пойдёте и ограбите ювелирный.
В данном случае нужно самому разбить блок, а не уведомлять о том, что вы собираетесь это сделать.
 
Ладно переформулирую вопрос:
Мне нужно:
- разбить блок с одного удара.
- получить с него дроп
- удалить из инструмента 1 пункт стойкости
- добавить в статистику игрока этот блок (в клиенте)
помимо этого:
- все установленные плагины должны сработать

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

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


или типа этого:
Код:
player.getTargetBlock(null, 200).breakNaturally();

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

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

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


или типа этого:
Код:
player.getTargetBlock(null, 200).breakNaturally();

вы ошибетесь!
Убери через NMS прочность блока до нулевой, но это будет работать на всех и сразу.
 
Нельзя только силой мысли вещи создавать всё остальное можно.
Как минимум сам клиент посылает какой то пакет серверу мол блок разбил.
Это-то конечно, как бы сервер тогда узнавал о действиях клиента?
 
Ладно переформулирую вопрос:
Мне нужно:
- разбить блок с одного удара.
- получить с него дроп
- удалить из инструмента 1 пункт стойкости
- добавить в статистику игрока этот блок (в клиенте)
помимо этого:
- все установленные плагины должны сработать

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

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

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

Есть пакет PacketPlayInBlockDig. Он по идее приходит от клиента. Можно ли с самого сервера проэмулировать поступление такого пакета, я не знаю — мне как правило нужно либо обработать уже поступивший пакет от клиента или отправить пакет клиенту. Скорее всего посредством ProtocolLib эту задачу решить можно. Но... если Вам нужна одна эта функция, то считайте, что Вы поехали на танке по велосипедной дорожке.
 
Поломка с одного удара? А чем не угодил PlayerInteractEvent и проверка на левый клик?
Кстати, такая возможность предусмотрена в WorldEdit (команда //).
 
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:
 
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:
А что, BlockBreakEvent не вызывается при ломании блока плагином?
 
Назад
Верх