▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/ProtoWeaver
ProtoWeaver

ProtoWeaver

Библиотека для создания кастомных сетевых протоколов на внутреннем сервере Netty в Майнкрафт.

Оцените первым
6.0K
26

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 очень простой - разберёшься за пару минут.

Часто задаваемые вопросы

Совместимость

Minecraft: Java Edition

26.1.x1.21.x1.20.x1.19.x1.18.x1.17.x1.16.x1.15.x1.14.x

Ссылки

Создатели

Детали

Лицензия:
Опубликован:2 года назад
Обновлён:3 месяца назад
Главная