ProtoWeaver
Активный0.0
Установок
Последнее обновление
Версии
ProtoWeaver
ProtoWeaver — это мощная библиотека для создания пользовательских сетевых протоколов, которые работают непосредственно на встроенном Netty-сервере Minecraft. Больше не нужно перенаправлять клиентские соединения через прокси для передачи данных — теперь всё работает на одном порту!
Что это значит на практике?
Устали от сложных обходных путей для обмена данными между сервером и прокси? ProtoWeaver решает эту проблему, позволяя создавать собственные протоколы, которые функционируют на том же порту, что и основной Minecraft-сервер. Это означает, что прокси-серверы вроде Velocity могут взаимодействовать с игровым сервером независимо от того, находятся ли игроки онлайн, без необходимости запуска дополнительных сокет-серверов на других портах.
Но возможности ProtoWeaver не ограничиваются только прокси! С помощью модуля client любое стороннее Java-приложение может напрямую общаться с вашим протоколом.
Основные преимущества
Библиотека сочетает в себе скорость, безопасность и простоту использования:
- Все протоколы работают в том же Netty-инстансе, что и Minecraft
- Встроенное SSL-шифрование для защиты данных
- Интуитивно понятный API для быстрого старта
- Автоматическая аутентификация протоколов
- Поддержка различных методов сжатия (Gzip, Snappy, LZ)
- Совместимость со всеми основными загрузчиками модов
- Пакеты представлены в виде обычных POJO-объектов
- Возможность настройки собственной сериализации
Начало работы
Добавьте в ваш файл build.gradle:
Важно: Не включайте ProtoWeaver в ваш мод! Это отдельная модификация, которая должна устанавливаться вместе с вашей.
repositories {
maven { url "https://maven.mrnavastar.me/releases" }
}
dependencies {
// 'common' можно заменить на: client, fabric, forge, paper или proxy.
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);
Отправка пакетов
Отправка данных максимально упрощена. Любой 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());
}
}
public class MyCustomClientHandler 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("Отправляем приветствие!");
connection.send("Привет, сервер!");
}
}
Пользовательская сериализация
Для работы с объектами 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();