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

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

Нет прав для скачивания
54
17
Подробней можно? Выше вы сказали "Унаследуй оба интерфейса" но прикол в том что тогда наследуешь оба интерфейса он не понмает что это и то и то и думаю что когда пакет я шлю с клиента я шлю серверный
 
54
17
Java:
    public void onKeyPressed(InputEvent.KeyInputEvent event) {
        System.out.println("onKeyPressed");
        for (KeyBinding key : Minecraft.getInstance().options.keyHotbarSlots)
            if (key.isDown()) {
                new ExamplePacket1(key.getKey().getValue()).sendToServer();
                break;
            }
    }

Java:
@ElegantPacket
public class ExamplePacket1 implements ClientToServerPacket, ServerToClientPacket {
    final int keyCode;

    public ExamplePacket1(int keyCode) {
        this.keyCode = keyCode;
    }
    
    @Override
    public void onReceive(ServerPlayerEntity player) {
        System.out.println("ExamplePacket1#onReceive keyCode: " + keyCode);
        new ExamplePacket1(player.level.random.nextInt(10)).sendToPlayer(player);
    }

    @Override
    public void onReceive(Minecraft mc) {
        System.out.println("ExamplePacket2#onReceive randomInt: " + keyCode);
    }
}
 

GoogleTan

Картошка :3
1,354
43
310
Ты вызываешь методы, и они соотвествуют конкретной стороне. Когда пакет вернутся обратно игроку, при обратотке он попробует послать его игроку.
 

GoogleTan

Картошка :3
1,354
43
310
Можно. Ты в обработке пакета посылваешь покает НА КЛИЕНТ и если обработка просходит НА КЛИЕНТЕ то происходит ошибка.
 
54
17
Java:
@ElegantPacket
public class ExamplePacket1 implements ClientToServerPacket, ServerToClientPacket {
    final int keyCode;

    public ExamplePacket1(int keyCode) {
        this.keyCode = keyCode;
    }

    @Override
    public void onReceive(ServerPlayerEntity player) {
        System.out.println("ExamplePacket1#onReceive keyCode: " + keyCode);
    }

    @Override
    public void onReceive(Minecraft mc) {
        System.out.println("ExamplePacket2#onReceive randomInt: " + keyCode);
    }
}
Чистый пакет все также не пашет
 
54
17
А проблема вся в том что унаследовать сразу оба интерфейса нельзя:
Java:
   if (side == LogicalSide.CLIENT && packet instanceof ServerToClientPacket)
            throw new RuntimeException("Attempt to send ServerToClientPacket from client side: " + packet.getClass().getCanonicalName());
        else if (side == LogicalSide.SERVER && packet instanceof ClientToServerPacket)
            throw new RuntimeException("Attempt to send ClientToServerPacket from server side: " + packet.getClass().getCanonicalName());
Как только проверка заметит что у тебя оба интерфейса на клиенте она бросит исключение!
Поэтому и спросил можно ли это обойти так как я могу чтото упустить?
 

GoogleTan

Картошка :3
1,354
43
310
Нет... если ты слешь с лкиента на клиент или с сервера на сервер, то будет исключение.
 
54
17
Я посылаю при нажатии на кнопку от ClientSide на сервера и оно уже крашит
 

GoogleTan

Картошка :3
1,354
43
310
Нет, оно крашит когда обрабатывает пакет. Если ты не можешь доказать обратного логом
 
54
17
Так ты меня обманул тогда если так? Смотри в чем ты меня обманул ты сказал что можно повесить два интерфейса так? Так! А теперь смотри проверку ниже если у нас клиент сайд и интерфейс ServerToClientPacket то исключение! Получается вешать на пакеты которы отправляются с клиента интерфейс ServerToClientPacket нельзя и это факт!

Java:
 if (side == LogicalSide.CLIENT && packet instanceof ServerToClientPacket)
            throw new RuntimeException("Attempt to send ServerToClientPacket from client side: " + packet.getClass().getCanonicalName());
        else if (side == LogicalSide.SERVER && packet instanceof ClientToServerPacket)
            throw new RuntimeException("Attempt to send ClientToServerPacket from server side: " + packet.getClass().getCanonicalName());
А ты говорил повесить нужно оба
 

GoogleTan

Картошка :3
1,354
43
310
Читаем код:
Если сторона клиент и мы шлем на клиент, то кидаем исключение
Но если мы на сервере и шлем на сервер тоже кидаем исключение
 
54
17
Так бля это проверка не отсылки пакета а интерфейса которы висит на пакете! И если на пакете висит интерфеса оба то и обе проверки будут реагировать на это
 
54
17
И если на пакете висит интерфеса оба то и обе проверки будут реагировать на это
 

GoogleTan

Картошка :3
1,354
43
310
Эта проверка где находится? В отсылке пакета
 

GoogleTan

Картошка :3
1,354
43
310
Так ты меня обманул тогда если так? Смотри в чем ты меня обманул ты сказал что можно повесить два интерфейса так? Так! А теперь смотри проверку ниже если у нас клиент сайд и интерфейс ServerToClientPacket то исключение! Получается вешать на пакеты которы отправляются с клиента интерфейс ServerToClientPacket нельзя и это факт!

Java:
 if (side == LogicalSide.CLIENT && packet instanceof ServerToClientPacket)
            throw new RuntimeException("Attempt to send ServerToClientPacket from client side: " + packet.getClass().getCanonicalName());
        else if (side == LogicalSide.SERVER && packet instanceof ClientToServerPacket)
            throw new RuntimeException("Attempt to send ClientToServerPacket from server side: " + packet.getClass().getCanonicalName());
А ты говорил повесить нужно оба
откуда этот код? Где ты такое нашел?
 

GoogleTan

Картошка :3
1,354
43
310
Нашла, репорт сделала, серж в след обнове пофиксит
 
Сверху