Иконка ресурса

ElegantNetworking - максимально изящная пакетная система 1.0 prealpha

Нет прав для скачивания
Версия(и) Minecraft
1.12.2+-
Недавно делал ремейк тутора по пакетной системе CodeChickenLib
и у меня сложилось новое виденье идеальной пакетной системы

ElegantNetworking - пакетная система, которая стремится максимально упростить разработку клиент-серверного взаимодействия в модах.
Примерно так выглядит объявление пакета:
Java:
@ElegantPacket
@Value //lombok
public class PacketExample implements ClientToServerPacket {
    int someValue1;
    MyClass someValue2;
    Map<String, MyClass> someValue3;

    @Override
    public void onReceive(EntityPlayerMP player, INetHandlerPlayServer handler) {
        //обработка пакета 
    }
}
И использование пакета:
Java:
new PacketExample(1, new MyClass(...), ImmutableMap.of(...)).sendToServer();

Основные фишки

  • Авто-регистрация пакетов
    • достаточно пометить аннотацией
    • можно забыть про канал и идентификаторы пакетов
  • Авто-сериализация/десериализация
    • поддерживаются примитивы, коллекции и эквиваленты алгебраических типов данных
    • возможно переопределить логику сериализации
  • Структура пакета и его обработчик локализованы
    • один пакет - один класс
  • Дизайн апи располагает к тому, чтобы не зависеть от версии майнкрафта
  • Совместимо с обфускаторами(чисто теоретически, еще не тестировал это)

Использование

Подключение к проекту
Добавьте в свой build.gradle:
Gradle (Groovy):
repositories {
    ...
    maven { url 'https://jitpack.io' }
}
mc_version = "1.12.2"
dependencies {
    compile 'com.github.hohserg1:ElegantNetworking:$(mc_version)-SNAPSHOT'
}
Выполните Gradle refresh в вашей ide

Создание пакета
1. Создайте новый класс для пакета.
Если ваш пакет должен отправляться с клиента на сервер, то он должен реализовывать ClientToServerPacket.
Если должен отправляться с сервера на клиент, то он должен наследоваться от ServerToClientPacket
2. Реализуйте нужный интерфейс.
Метод onReceive будет вызываться при получении пакета
3. Пометьте ваш класс пакета аннотацией @ElegantPacket
Опционально, в ней можно указать строковый id канала(может иметь смысл, если в одном jar несколько модов)
4. Добавьте поля, представляющие передаваемую информацию
Можно использовать Lombok, чтобы сгенерировать удобный конструктор, геттеры и сеттеры
5. Опционально можно переопределить логику сериализации. Для этого переопределите метод serialize, он должен возвращать ByteBuf-представление вашего пакета. И создайте конструктор, принимающий ByteBuf, он должен делать обратное действие
Пример:
Java:
@ElegantPacket
@Value
public class ExamplePacket implements ServerToClientPacket {
    int someInt;
    Map<MyClass, String> someMap;
   
    @Override
    public void onReceive(Minecraft mc) {
        System.out.println("test "+someInt+" "+someMap);
    }
}
Отправка пакета
Просто создайте экземпляр вашего пакета с нужными значениями полей и вызовите один из send-методов
ClientToServerPacket имеет один метод - sendToServer
ServerToClientPacket имеет целый набор удобных методов для отправки пакета клиентам
Java:
//Отправка someInt=1 и someMap={new MyClass("test") -> "lol"} всем игрокам в измерении world
new ExamplePacket(1, ImmutableMap.of(new MyClass("test"), "lol")).sendToDimension(world);

Благодарности

Спасибо @Dahaka за обсуждение концепции и ревью
Спасибо @tox1cozZ за то что обратил моё внимание на процессоры аннотаций
Спасибо @Plasticable за совет о юзе 4.4.1 версии gradle
Спасибо @Icosider за консультацию по настройке gradle
Автор
hohserg1
Скачивания
13
Просмотры
400
Первый выпуск
Обновление
Оценка
5.00 звёзд 2 оценок

Другие ресурсы пользователя hohserg1

Последние рецензии

Всё очень круто!
Только самое необходимое и максимально удобное )
Люблю минимализм.
Если собрать все либы которые тут уже навыкладывали, написание мода любой сложности превратится в пару строчек кода.
Сверху