Команды в командных блоках

q20w26a

Разработчик
Инструктор
Пользователь
Сообщения
580
Решения
27
Можно ли получить команду в блоке именно когда игрок нажимает на кнопку "Ок" (или что там)? Короче, когда применяет команду к блоку. Ивентов я не нашел связанных с командными блоками.
 
Решение
Можно ли получить команду в блоке именно когда игрок нажимает на кнопку "Ок" (или что там)? Короче, когда применяет команду к блоку. Ивентов я не нашел связанных с командными блоками.
Вот, нашёл. Этот пакет клиент отправляет серверу, когда изменяет команду/режим командного блока

Java:
    @Override
    @SneakyThrows
    public void onEnable() {
        protocolManager.addPacketListener(new PacketAdapter(this,
                ListenerPriority.NORMAL,
                PacketType.Play.Client.SET_COMMAND_BLOCK) {
            @Override
            public void onPacketReceiving(PacketEvent event) {
                event.getPlayer().sendMessage("lolKekCheburek");
            }
        });
    }


Вам необходимо зарегистрироваться для просмотра изображений-вложений
Если ты о командных блоках: Когда игрок прописывает команду для командного блока и нажимает на её сохранение он её лишь устанавливает/сохраняет для данного блока, но ни как не выполняет её.

Если нет, то переформулируй, лично я не очень понял смысла.
 
не то?
P.S. Ctrl + F в строчке набрать: getCommand

Получает команду, которую этот командный блок будет выполнять при поступлении питания.

Версия: Spigot-API 1.16.1-R0.1-SNAPSHOT API
 
Не совсем. Я фактически просто не знаю, как получить ее в момент ввода.
Сейчас у меня есть это:

Java:
     @EventHandler
    public void onBlockClicked(PlayerInteractEvent event) {
        if (event.getAction() == Action.RIGHT_CLICK_BLOCK) {
            Block block = event.getClickedBlock();
            if (isCommandBlock(block.getType())) {
                CommandBlock cBlock = (CommandBlock) block.getState();
                
            }
        }
    }

Я могу получать тут команду каждый раз, когда игрок кликает по блоку, но это не то.
 
И не то, и не другое. Я хочу понять, как мне получить эту чертову команду.
Почитал что интерфейсы командных блоков полностью теперь клиентские, видимо, остаются лишь пакеты. Все таки, тему закрывать не буду, вдруг есть решения лучше.
 
В одиночной игре, когда игрок прописывает команду в КБ и нажимает на Done, ему в чат отправляется сообщение о том, какая команда была задана. Возможно ли это сообщение перехватить тем же классом который используется в плагинах на чат реакции (когда в чат пишут текст и если он совпадает с одним из тех, что были прописаны в конфигурации, то он выполняет определённое действие которое было указано для данного сообщения)?
 
Вообще, те же сообщения - просто пакеты. Если я не ошибаюсь, раньше (а может и сейчас тоже) метод Player#sendMessage банально отправлял пакет чата. Я уже нашел примерно то, что мне нужно, но я теперь не знаю как ловить пакеты.
Придется либо лепить велосипеды с Netty, либо использовать ProtocolLib (чего делать не хочется).
 
блокирует команду?

Если игрок взаимодействуется с командным блоком, то можно получить его местоположение, а затем можно выполнить getCommand (), но когда происходит PlayerInteractEvent команда, еще не введена. Я не знаю как это исправить, но я знаю, что можно помочь плагину определять когда нужно проверять введённую команду с помощью если это конечно работает в командных блоках
 
Можно ли получить команду в блоке именно когда игрок нажимает на кнопку "Ок" (или что там)? Короче, когда применяет команду к блоку. Ивентов я не нашел связанных с командными блоками.
Вот, нашёл. Этот пакет клиент отправляет серверу, когда изменяет команду/режим командного блока

Java:
    @Override
    @SneakyThrows
    public void onEnable() {
        protocolManager.addPacketListener(new PacketAdapter(this,
                ListenerPriority.NORMAL,
                PacketType.Play.Client.SET_COMMAND_BLOCK) {
            @Override
            public void onPacketReceiving(PacketEvent event) {
                event.getPlayer().sendMessage("lolKekCheburek");
            }
        });
    }


Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Последнее редактирование:
Спасибо, но теперь я не вдупляю, как мне получить саму команду.

Java:
                PacketContainer packet = event.getPacket();
                Field f = packet.getStrings().getFields().get(0);
                f.setAccessible(true);
                String command = null;
                try {
                    command = (String) f.get("");
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                System.out.println(command);

Дает огромный стактрейс и не то, что я ожидаю:
Код:
[16:35:23] [Netty Epoll Server IO #2/ERROR]: [BlockCommandBlocks] Unhandled exception occured in onPacketReceiving(PacketEvent) for BlockCommandBlocks
java.lang.IllegalArgumentException: Can not set java.lang.String field net.minecraft.server.v1_16_R1.PacketPlayInSetCommandBlock.b to java.lang.String
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[?:1.8.0_265]
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[?:1.8.0_265]
        at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:58) ~[?:1.8.0_265]
        at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) ~[?:1.8.0_265]
        at java.lang.reflect.Field.get(Field.java:393) ~[?:1.8.0_265]
        at me.vahelce.commandblocks.Main$1.onPacketReceiving(Main.java:38) ~[?:?]
        at com.comphenix.protocol.injector.SortedPacketListenerList.invokeReceivingListener(SortedPacketListenerList.java:114) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.SortedPacketListenerList.invokePacketRecieving(SortedPacketListenerList.java:67) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.PacketFilterManager.handlePacket(PacketFilterManager.java:590) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.PacketFilterManager.invokePacketRecieving(PacketFilterManager.java:557) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.netty.ProtocolInjector.packetReceived(ProtocolInjector.java:350) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.netty.ProtocolInjector.onPacketReceiving(ProtocolInjector.java:315) [ProtocolLib.jar:4.5.1]
        at com.comphenix.protocol.injector.netty.ChannelInjector.decode(ChannelInjector.java:538) [ProtocolLib.jar:4.5.1]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at com.comphenix.protocol.injector.netty.ChannelInjector$2.channelRead(ChannelInjector.java:259) [ProtocolLib.jar:4.5.1]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:808) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:408) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:308) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [spigot-1.16.1.jar:git-Spigot-0287a20-7560f5f]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_265]
        
[16:35:23] [Netty Epoll Server IO #2/ERROR]: Parameters:
  net.minecraft.server.v1_16_R1.PacketPlayInSetCommandBlock@9673575[
    a=BlockPosition{x=43, y=67, z=-62}
    b=band
    c=true
    d=false
    e=false
    f=REDSTONE
  ]
 
Спасибо, но теперь я не вдупляю, как мне получить саму команду.

Java:
    @Override
    @SneakyThrows
    public void onEnable() {
        protocolManager.addPacketListener(new PacketAdapter(this,
                ListenerPriority.NORMAL,
                PacketType.Play.Client.SET_COMMAND_BLOCK) {
            @Override
            public void onPacketReceiving(PacketEvent event) {
                event.getPlayer().sendMessage("Он ввёл какую-то хрень: " + event.getPacket().getStrings().read(0));
            }
        });
    }
 
Назад
Сверху Снизу