- Баллы
- 66
- Имя в Minecraft
- _Sweettie_
Вопрос к гуру, пару дней смотрю в монитор и ничего не понимаю, по поводу общения пакетами клиент->сервер->клиент.
Клиент - мод fabric
Сервер - paper
Версия 1.21.1
Извиняюсь что приходится показывать двумя сообщениями, дс ограничивает
В моде, как указано в официальной документации fabric https://docs.fabricmc.net/develop/networking#receiving-a-packet-on-the-client, создан класс от CustomPayload, зарегестрирован как S2C, C2S
Код:
TestDataPayload.java
Код:
На сервере же в плагине при инициализации регистрирую этот канал на получение и отправку
Код:
Сервер видит пакет игрока, который отправляется при заходе на сервер, отправляет пакет игроку, при этом на клиенте ничего не происходит и ничего не логируется (пакет от сервер не дошёл до клиента).
Если кто-то знает почему и как это можно исправить - буду очень признателен
Клиент - мод 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());
}
Сервер видит пакет игрока, который отправляется при заходе на сервер, отправляет пакет игроку, при этом на клиенте ничего не происходит и ничего не логируется (пакет от сервер не дошёл до клиента).
Если кто-то знает почему и как это можно исправить - буду очень признателен