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

(tiny) Система пакетов

Версия(и) Minecraft
1.10.2
Итак, я тут ковырялся в одном своём старом моде (у которого внезапно 144к загрузок и потому я решил попробовать его обновить до актуальных версий) и нашёл там алмазик от самого себя из прошлого.

Я без понятия насколько актуально оно для всяких там последних версий, но вроде класс FMLEventChannel не должны были просто взять и убрать, так что всё должно работать.

Невероятно простой, без усложнений и лишних классов, способ работы с сетью.
Сказочно удобно если у вас всего три пакета и вы не хотите пилить невероятный менеджер с кучей кода, классов и абстракций.

Как вы уже поняли, используется забавный класс форджа - FMLEventChannel, который делает всю работу за нас.

В принципе всё настолько просто, что вам подскажет просто следующий пример и подсказки в IDE, потому это всё я и пишу в сливы:

Network.init() я вызывал в preinit-е мода, всё работало)

Код:
public final class Network {

    private static FMLEventChannel chan;

    private Network() {}

    public static void init() {
        chan = NetworkRegistry.INSTANCE.newEventDrivenChannel(MODID);
        chan.register(new Network());
    }

    @SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void onClientReceive(ClientCustomPacketEvent e) {
        PacketBuffer payload = new PacketBuffer(e.getPacket().payload());
        switch(payload.readByte()) {
            case 0:
                System.out.println("received first packet type on client");
                System.out.println("entity id = " + payload.readInt());
                System.out.println("f = " + payload.readFloat());
                System.out.println("b = " + payload.readBoolean());
                break;
            case 1:
                // this is on client side, remember
                System.out.println(Minecraft.getMinecraft().thePlayer);
                System.out.println("got a personal message from the server: " + payload.readStringFromBuffer(Integer.MAX_VALUE));
                break;
        }
    }

    @SubscribeEvent
    @SideOnly(Side.SERVER)
    public void onServerReceive(ServerCustomPacketEvent e) {
        PacketBuffer payload = new PacketBuffer(e.getPacket().payload());
        switch(payload.readByte()) {
            // just the same as above ^, and server-side-only stuff is available too
        }
    }

    private static FMLProxyPacket packet(int id, Consumer<PacketBuffer> data) {
        PacketBuffer payload = new PacketBuffer(Unpooled.buffer());
        payload.writeByte(id);
        data.accept(payload);
        return new FMLProxyPacket(payload, MODID);
    }

    public static void sendSomePacketToClients(Entity entity, float f, boolean b) {
        chan.sendToDimension(packet(0, p -> {
            p.writeInt(entity.getEntityId());
            p.writeFloat(f);
            p.writeBoolean(b);
        }), entity.dimension);
    }

    public static void sendOtherPacketToClient(EntityPlayerMP client, String data) {
        chan.sendTo(packet(1, p -> {
            p.writeString(data);
        }), client);
    }
}
  • Like
Реакции: hohserg
Автор
necauqua
Просмотры
1,312
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

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

Последние обновления

  1. 1.13-1.16

    Крч в 1.13 и далее Forge решил сильно поменяться, причём не в лучшую сторону (хотя некоторые...
Сверху