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

Помогите общение пакетами клиент->сервер->клиент

Тема в разделе "Разработка плагинов для новичков", создана пользователем sweettie, 21 авг 2025 в 15:07.

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

    sweettie Активный участник

    Баллы:
    61
    Имя в Minecraft:
    _Sweettie_
    Вопрос к гуру, пару дней смотрю в монитор и ничего не понимаю, по поводу общения пакетами клиент->сервер->клиент.
    Клиент - мод fabric
    Сервер - paper
    Версия 1.21.1

    Извиняюсь что приходится показывать двумя сообщениями, дс ограничивает

    В моде, как указано в официальной документации fabric https://docs.fabricmc.net/develop/networking#receiving-a-packet-on-the-client, создан класс от CustomPayload, зарегестрирован как S2C, C2S
    Код:
    public static void register() {
            PayloadTypeRegistry.playC2S().register(TestDataPayload.ID,TestDataPayload.CODEC );
            PayloadTypeRegistry.playS2C().register(TestDataPayload.ID, TestDataPayload.CODEC );
            ClientPlayNetworking.registerGlobalReceiver(TestDataPayload.ID, (payload, context) -> {
                System.out.println("Handle server answer: "+payload.data());
            });
            ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
                MinecraftClient mc = MinecraftClient.getInstance();
                if (mc.player == null) return;
    
                ClientPlayNetworking.send(new TestDataPayload("REG"));
                System.out.println("Send null token to REG");
            });
        }
    TestDataPayload.java
    Код:
    public record TestDataPayload(String data) implements CustomPayload {
    
        public static final Identifier PAYLOAD_ID = Identifier.of("modid", "test");
        public static final Id<TestDataPayload> ID = new Id<>(PAYLOAD_ID);
    
        public static final PacketCodec<PacketByteBuf, TestDataPayload> CODEC =
                CustomPayload.codecOf(TestDataPayload::write, TestDataPayload::read);
    
        private void write(PacketByteBuf buf) {
            buf.writeString(data);
        }
    
        private static TestDataPayload read(PacketByteBuf buf) {
    
            String data = buf.readString();
            System.out.println("READ PACKET "+data);
            return new TestDataPayload(data);
        }
    
        @Override
        public Id<? extends CustomPayload> getId() {
            return ID;
        }
    }
    На сервере же в плагине при инициализации регистрирую этот канал на получение и отправку
    Код:
    public static final String CHANNEL_AUTH = "modid:test";
    
        ...
    
        @Override
        public void onEnable() {
            LOGGER = getLogger();
            Bukkit.getMessenger().registerIncomingPluginChannel(this, CHANNEL_AUTH, this);
            Bukkit.getMessenger().registerOutgoingPluginChannel(this, CHANNEL_AUTH);
        }
    
        @Override
        public void onPluginMessageReceived(@NotNull String channel, @NotNull Player player, byte @NotNull [] message) {
            System.out.println("Input on channel " + channel + " from player " + player.getName() + " with data " + message.length + " " + new String(message, StandardCharsets.UTF_8));
            if (channel.equals(CHANNEL_AUTH)) {
                sendResponse(player, "some data");
            }
        }
    
        private void sendResponse(Player player, String data) {
            ByteArrayDataOutput out = ByteStreams.newDataOutput();
            out.writeUTF(data);
            player.sendPluginMessage(this,CHANNEL_AUTH,out.toByteArray());
        }
    Сервер видит пакет игрока, который отправляется при заходе на сервер, отправляет пакет игроку, при этом на клиенте ничего не происходит и ничего не логируется (пакет от сервер не дошёл до клиента).
    Если кто-то знает почему и как это можно исправить - буду очень признателен
     
  2. Хостинг MineCraft
    <

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