ProtoWeaver
Сетевая библиотека для создания собственных протоколов, работающих на внутреннем сервере netty.
- Загрузчики
- FabricNeoForgeForgeQuilt
- Скачиваний на Modrinth
- 7 тыс.
- Подписчиков на Modrinth
- 27
- версии
- 134
- Обновлён
- 1 апреля 20261 апр.
- Опубликован
- в 2023
Коротко о моде
Автор не указал, где нужен мод
ProtoWeaver
Библиотека сетевого взаимодействия для Minecraft, позволяющая создавать собственные протоколы, работающие на внутреннем netty-сервере.
Что это значит?
Надоело перехватывать клиентские подключения, чтобы гонять данные туда-сюда через прокси? Мне вот точно надоело. ProtoWeaver позволяет создать собственный протокол, работающий на том же порту, что использует сервер Minecraft. Это значит, что прокси вроде velocity может общаться с сервером независимо от того, онлайн игроки или нет, без запуска дополнительного сокет-сервера на другом порту. Protoweaver при этом не ограничен только прокси. С помощью модуля client любое стороннее Java-приложение может напрямую общаться с ProtoWeaver!
Protoweaver быстрый, безопасный и простой в использовании. Все протоколы работают в том же netty-инстансе, что и Minecraft, шифруются через ssl и обёрнуты в очень понятный api. Давайте посмотрим:
Возможности
- [x] Не требует настройки пользователем
- [x] SSL-шифрование
- [x] Аутентификация протокола
- [x] Пакеты как POJO
- [x] Сжатие (Gzip, Snappy, LZ)
- [x] Все основные загрузчики модов (neoforge скоро tm)
- [ ] API для регистрации сырых протоколов (http, ssh и т.д.)
- [x] Кастомная сериализация
- [ ] Кастомные SSL-провайдеры/сертификаты
- [ ] Мультипротокольные подключения
- [ ] Скажите, что вы хотите увидеть!
Настройка проекта
В ваш build.gradle добавьте
* Примечание: **Не шейдьте protoweaver! Он не будет работать корректно. ProtoWeaver — это мод/плагин, который устанавливается вместе с вашим!
repositories {
maven { url "https://maven.mrnavastar.me/releases" }
}
dependencies {
// 'common' можно заменить на любой из: `client`, `fabric`, `forge`, `paper` или `proxy`.
implementation "me.mrnavastar.protoweaver:common:1.3.11"
}Создание протокола
Протоколы очень гибко настраиваются и имеют много встроенного функционала. Вот пример протокола:
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);Отправка пакетов
Отправлять пакеты крайне просто. Любой POJO, добавленный в протокол (см. Создание протокола), является допустимым пакетом для отправки. Учтите, что вся сериализация POJO выполняется через kyro — быструю библиотеку сериализации.
// Если у вас есть ссылка на 'ProtoConnection', можно просто:
connection.send(myObject);
// Если у вас есть ссылка на 'ProtoClient', можно также:
client.send(myObject);Обработка пакетов
Всем протоколам нужны обработчики для реализации функционала. Клиент и сервер могут использовать либо один и тот же обработчик, либо разные.
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());
}
}
```java
public class MyCustomClientHandler implements ProtoConnectionHandler {
// Учтите, что все функции необязательны для реализации
@Override
public void void onReady(ProtoConnection connection) {
System.out.println("awesome! connected to: " + connection.getRemoteAddress());
}
@Override
public void onDisconnect(ProtoConnection connection) {
System.out.println("goodbye: " + connection.getRemoteAddress());
}
@Override
public void handlePacket(ProtoConnection connection, Object packet) {
System.out.println("saying hi!");
connection.send("Hey server!");
}
}Кастомная сериализация
Иногда бывает полезно отправлять по своему протоколу объекты Minecraft или другие готовые POJO. Чтобы это стало возможным, можно зарегистрировать кастомный сериализатор.
Например, вот сериализатор для NBT-тегов:
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 под свою версию Minecraft, скачайте ProtoWeaver под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть ProtoWeaver?
У ProtoWeaver есть сборки для Minecraft 1.14–26.1.1.