
ProtoWeaver
Библиотека для создания кастомных сетевых протоколов на внутреннем сервере Netty в Майнкрафт.
ProtoWeaver - кастомные протоколы для Minecraft
ProtoWeaver - это мод/библиотека для Minecraft, которая позволяет создавать собственные сетевые протоколы, работающие на том же порту, что и сам сервер. Другими словами, тебе больше не нужно захватывать клиентские соединения для обмена данными с прокси или использовать отдельный порт для дополнительных сокетов. Всё работает прозрачно и без лишних костылей.
Зачем это вообще нужно? Ну, например, если у тебя сервер с прокси вроде Velocity или BungeeCord - ProtoWeaver даёт возможность общаться с сервером напрямую, даже если на сервере нет игроков. Больше не надо запускать отдельные сокет-сервера на разных портах. А ещё с помощью модуля client любое Java-приложение может стучаться к твоему серверу по кастомному протоколу.
Особенности ProtoWeaver
- Нулевая настройка - всё работает сразу после установки
- SSL-шифрование - защита соединений без лишнего геморроя
- Аутентификация протоколов - доступ к твоему протоколу будет только у тех, у кого есть ключи
- Пакеты как POJO - шлёшь любые Java-объекты без возни с сериализацией
- Сжатие - Gzip, Snappy, LZ
- Поддержка модлоадеров - Fabric, Forge, Paper, а NeoForge скоро
- Кастомная сериализация - например, для отправки NBT-тегов или других Minecraft-объектов
Как подключить
В build.gradle добавляешь репозиторий и зависимость:
repositories {
maven { url "https://maven.mrnavastar.me/releases" }
}
dependencies {
implementation "me.mrnavastar.protoweaver:common:1.3.11"
}
Важно: не затеняй ProtoWeaver - это мод, который ставится рядом с твоим, а не вшивается в него.
Создание протокола
Допустим, хочешь сделать кастомный протокол для своего мода:
Protocol protocol = Protocol.create("my_mod_id", "cool_protocol")
.setCompression(CompressionType.GZIP)
.setServerHandler(MyCustomServerHandler.class)
.setClientHandler(MyCustomClientHandler.class)
.setMaxConnections(15)
.addPacket(String.class)
.build();
ProtoWeaver.load(protocol);
Всё, протокол зарегистрирован. Теперь можешь отправлять и принимать пакеты.
Отправка пакетов
Если у тебя есть ссылка на ProtoConnection или ProtoClient:
connection.send(myObject);
client.send(myObject);
Пакетом может быть любой POJO, который ты добавил в протокол. Сериализация идёт через Kyro - быстро и удобно.
Обработка пакетов
Прописываешь хендлеры - они могут быть одинаковыми для сервера и клиента или разными:
public class MyCustomServerHandler implements ProtoConnectionHandler {
@Override
public void void onReady(ProtoConnection connection) {
System.out.println("Подключился новый клиент: " + connection.getRemoteAddress());
}
@Override
public void onDisconnect(ProtoConnection connection) {
System.out.println("Отключился: " + connection.getRemoteAddress());
}
@Override
public void handlePacket(ProtoConnection connection, Object packet) {
System.out.println("Получено: " + packet.toString() + " от " + connection.getRemoteAddress());
}
}
Для клиента - аналогично, можно сразу отвечать серверу:
public class MyCustomClientHandler implements ProtoConnectionHandler {
@Override
public void void onReady(ProtoConnection connection) {
System.out.println("Подключился к " + connection.getRemoteAddress());
}
@Override
public void handlePacket(ProtoConnection connection, Object packet) {
System.out.println("Привет серверу!");
connection.send("Привет серверу!");
}
}
Кастомная сериализация
Если хочешь передавать, например, NBT-теги или другие Minecraft-объекты - регистрируешь свой сериализатор:
public class NbtSerializer extends ProtoSerializer<CompoundTag> {
public NbtSerializer(Class<CompoundTag> type) {
super(type);
}
@Override
public void write(ByteArrayOutputStream buffer, CompoundTag value) {
try {
NbtIo.writeCompressed(value, buffer);
} catch (IOException e) {
Platform.throwException(e);
}
}
@Override
public CompoundTag read(ByteArrayInputStream buffer) {
try {
return NbtIo.readCompressed(buffer, NbtAccounter.unlimitedHeap());
} catch (IOException e) {
Platform.throwException(e);
throw new RuntimeException(e);
}
}
}
И добавляешь в протокол:
Protocol protocol = Protocol.create("my_mod_id", "cool_protocol")
.setCompression(CompressionType.GZIP)
.setServerHandler(MyCustomServerHandler.class)
.setClientHandler(MyCustomClientHandler.class)
.setMaxConnections(15)
.addPacket(CompoundTag.class, NbtSerializer.class)
.build();
Что по итогу
ProtoWeaver - штука мощная для тех, кто пишет свои моды или плагины на Fabric/Forge/Paper и хочет сделать что-то с сетевым взаимодействием. Не надо мучиться с костылями, всё работает из коробки. Если тебе нужно общение сервера с прокси, или какого-то Java-приложения с сервером Майнкрафт - это твой вариант. Скачайте ProtoWeaver и попробуйте сами.
P.S. Документация ещё пишется, но API очень простой - разберёшься за пару минут.
