Просветите по пакетам

Версия Minecraft
1.12.2
Впервые пытаюсь в пакетную систему и что-то не работает

Init:
public class Init {

    public static SimpleNetworkWrapper NETWORK;
    public static void createNetwork() {
        NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel(Reference.MODID);
        NETWORK.registerMessage(Handler.class, MyPacket.class, 0, Side.SERVER);
    }
}
Handler:
public class Handler implements IMessageHandler<MyPacket, IMessage> {
    public void onClient(EntityPlayer player, MyPacket message) {}
    public void onServer(EntityPlayer player, MyPacket message) {
        System.out.println("Got Packet " + message.buf.readChar());
    }

    @Override
    public MyPacket onMessage(MyPacket message, MessageContext ctx) {
        EntityPlayer player = ctx.getServerHandler().player;
        if (ctx.side == Side.CLIENT) {
            onClient(player, message);
        }
        else {
            onServer(player, message);
        }
        return null;
    }
}
MyPacket:
public class MyPacket implements IMessage {
    ByteBuf buf = Unpooled.buffer();
    public MyPacket() {
        buf.writeChar('t');
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        this.buf = buf;
        System.out.println("fromBytes");

    }

    @Override
    public final void toBytes(ByteBuf buf) {
        if (buf != null) {
            buf.writeBytes(this.buf);
            System.out.println("toBytes wrote");
        }
    }
}
CommonProxy:
public void postInit(FMLPostInitializationEvent event)
{
    Init.createNetwork();
}
Отправка с клиента Init.NETWORK.sendToServer(new MyPacket());

Пишет в консоль "toBytes wrote" и "fromBytes", а потом выдаёт ошибку.
[11:29:31] [Netty Server IO #1/ERROR] [FML]: SimpleChannelHandlerWrapper exception
io.netty.util.IllegalReferenceCountException: refCnt: 0
at io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1408) ~[AbstractByteBuf.class:4.1.9.Final]
at io.netty.buffer.AbstractByteBuf.checkReadableBytes0(AbstractByteBuf.java:1394) ~[AbstractByteBuf.class:4.1.9.Final]
at io.netty.buffer.AbstractByteBuf.readShort(AbstractByteBuf.java:706) ~[AbstractByteBuf.class:4.1.9.Final]
at io.netty.buffer.AbstractByteBuf.readChar(AbstractByteBuf.java:808) ~[AbstractByteBuf.class:4.1.9.Final]
at com.skillmagic.network.Handler.onServer(Handler.java:12) ~[Handler.class:?]
at com.skillmagic.network.Handler.onMessage(Handler.java:22) ~[Handler.class:?]
at com.skillmagic.network.Handler.onMessage(Handler.java:9) ~[Handler.class:?]
Ошибка в строке System.out.println("Got Packet " + message.buf.readChar());
 
Решение
Не делай так. Не нужно самому создавать ByteBuf.
В пакете сделай нужные поля, записывай их в методе toBytes в buf из аргументов, читай в методе fromBytes аналогично.
В хандлере из message доставай переменные и используй.

tox1cozZ

aka Agravaine
8,454
598
2,890
Не делай так. Не нужно самому создавать ByteBuf.
В пакете сделай нужные поля, записывай их в методе toBytes в buf из аргументов, читай в методе fromBytes аналогично.
В хандлере из message доставай переменные и используй.
 
7,099
324
1,509
Рекомендую использовать ElegantNetworking
С ним пакеты делать легче всего
Например, пакет, отправляемый с сервера на клиент, передающий один чар:
Java:
public class MyPacket implements ServerToClientPacket {
    public char someChar;

    public void onReceive(Minecraft mc) {
        System.out.println("MyPacket received: " + someChar);
    }
}
Отправлять вот так
new MyPacket().sendToPlayer(player)
 
Последнее редактирование:
Сверху