diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java index 7e92a18..54f6608 100644 --- a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketEncoder.java @@ -10,7 +10,6 @@ import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import mc.core.network.NetOutputStream; import mc.core.network.SCPacket; -import mc.core.network.proto_1_12_2.ByteArrayOutputNetStream; import mc.core.network.proto_1_12_2.State; import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetOutputStream; @@ -18,17 +17,6 @@ import static mc.core.network.proto_1_12_2.netty.NettyServer.ATTR_STATE; @Slf4j public class PacketEncoder extends MessageToByteEncoder { - private static int sizeVarInt(final int value) { - byte size = 0; - int v = value; - - do { - v >>>= 7; - size++; - } while (v != 0); - - return size; - } @Override protected void encode(ChannelHandlerContext ctx, SCPacket packet, ByteBuf out) { @@ -41,13 +29,8 @@ public class PacketEncoder extends MessageToByteEncoder { log.debug("Send {}:{}", state, packet); - NetOutputStream netStream = new ByteArrayOutputNetStream(); - packet.writeSelf(netStream); - byte[] bytes = ((ByteArrayOutputNetStream) netStream).toByteArray(); - netStream = new WrapperNetOutputStream(out); - - netStream.writeVarInt(bytes.length + sizeVarInt(id)); + NetOutputStream netStream = new WrapperNetOutputStream(out); netStream.writeVarInt(id); - netStream.writeBytes(bytes); + packet.writeSelf(netStream); } } diff --git a/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java new file mode 100644 index 0000000..7e7b848 --- /dev/null +++ b/proto_1.12.2_netty/src/main/java/mc/core/network/proto_1_12_2/netty/PacketPostEncoder.java @@ -0,0 +1,38 @@ +package mc.core.network.proto_1_12_2.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import lombok.extern.slf4j.Slf4j; +import mc.core.network.proto_1_12_2.netty.wrappers.WrapperNetOutputStream; + +/** + * Подсчет размера отправляемого пакета + */ +@Slf4j +public class PacketPostEncoder extends MessageToByteEncoder { + + private static int getVarIntSize(int input) { + for (int i = 1; i < 5; ++i) { + if ((input & -1 << i * 7) == 0) { + return i; + } + } + + return 5; + } + + @Override + protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) { + final int pktSize = msg.readableBytes(); + final int sizeOfPktSize = getVarIntSize(pktSize); + + if (sizeOfPktSize > 3) { + log.warn("unable to fit {} into {}", pktSize, 3); + } + + out.ensureWritable(sizeOfPktSize + pktSize); + (new WrapperNetOutputStream(out)).writeVarInt(pktSize); + out.writeBytes(msg); + } +}