diff --git a/src/main/java/mc/protocol/io/NetInputStream.java b/src/main/java/mc/protocol/io/NetInputStream.java index 44950af..8fabfec 100644 --- a/src/main/java/mc/protocol/io/NetInputStream.java +++ b/src/main/java/mc/protocol/io/NetInputStream.java @@ -49,7 +49,7 @@ public abstract class NetInputStream extends InputStream { byte[] bytes = new byte[length * 4]; int readbleBytes = 0; - for (int i = 0; i < length; i++) { + for (int i = 0; i < length && readableBytes() > 0; i++) { byte b = readByte(); bytes[readbleBytes++] = b; diff --git a/src/test/java/mc/protocol/io/ByteArrayNetInputStream.java b/src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java similarity index 90% rename from src/test/java/mc/protocol/io/ByteArrayNetInputStream.java rename to src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java index 9214dee..7785711 100644 --- a/src/test/java/mc/protocol/io/ByteArrayNetInputStream.java +++ b/src/main/java/mc/protocol/io/coder/ByteArrayNetInputStream.java @@ -1,8 +1,10 @@ -package mc.protocol.io; +package mc.protocol.io.coder; + +import mc.protocol.io.NetInputStream; import java.nio.ByteBuffer; -class ByteArrayNetInputStream extends NetInputStream { +public class ByteArrayNetInputStream extends NetInputStream { private final ByteBuffer byteBuffer; private int index = 0; diff --git a/src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java similarity index 95% rename from src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java rename to src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java index b5192df..74893cc 100644 --- a/src/main/java/mc/protocol/io/ByteArrayNetOutputStream.java +++ b/src/main/java/mc/protocol/io/coder/ByteArrayNetOutputStream.java @@ -1,4 +1,6 @@ -package mc.protocol.io; +package mc.protocol.io.coder; + +import mc.protocol.io.NetOutputStream; import java.io.ByteArrayOutputStream; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java index b6fd920..55151e9 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolDecoder.java @@ -10,9 +10,6 @@ public class ProtocolDecoder { private final PacketDirection direction; public Packet decode(State state, NetInputStream netInputStream) { - //TODO необходим механизм пропуска необработанных байтов - int sizePacket = netInputStream.readVarInt(); - int packetId = netInputStream.readVarInt(); Class packetClass = state.getPacketById(direction, packetId); if (packetClass == null) { @@ -20,7 +17,7 @@ public class ProtocolDecoder { UnknownPacket packet = new UnknownPacket( state, packetId, - sizePacket - Utils.sizeOfVarInt(packetId) + netInputStream.readableBytes() ); packet.readSelf(netInputStream); return packet; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java index 1f04d06..973cf8d 100644 --- a/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java +++ b/src/main/java/mc/protocol/io/coder/ProtocolEncoder.java @@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor; import mc.protocol.Packet; import mc.protocol.PacketDirection; import mc.protocol.State; -import mc.protocol.io.ByteArrayNetOutputStream; import mc.protocol.io.NetOutputStream; import java.util.Objects; diff --git a/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java b/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java new file mode 100644 index 0000000..360810a --- /dev/null +++ b/src/main/java/mc/protocol/io/coder/ProtocolSplitter.java @@ -0,0 +1,32 @@ +package mc.protocol.io.coder; + +import mc.protocol.io.NetInputStream; + +public class ProtocolSplitter { + + public NetInputStream split(NetInputStream netInputStream) { + netInputStream.markReadIndex(); + byte[] buff = new byte[3]; + + for (int i = 0; i < buff.length; ++i) { + buff[i] = netInputStream.readByte(); + + if (buff[i] >= 0) { + NetInputStream nis = new ByteArrayNetInputStream(buff); + int sizePacket = nis.readVarInt(); + + if (netInputStream.readableBytes() >= sizePacket) { + buff = new byte[sizePacket]; + netInputStream.readBytes(buff); + + return new ByteArrayNetInputStream(buff); + } + + netInputStream.resetReadIndex(); + break; + } + } + + return null; + } +} diff --git a/src/test/java/mc/protocol/io/NetInputStreamTest.java b/src/test/java/mc/protocol/io/NetInputStreamTest.java index 75e9cdb..1c1ccae 100644 --- a/src/test/java/mc/protocol/io/NetInputStreamTest.java +++ b/src/test/java/mc/protocol/io/NetInputStreamTest.java @@ -1,5 +1,6 @@ package mc.protocol.io; +import mc.protocol.io.coder.ByteArrayNetInputStream; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/mc/protocol/io/NetOutputStreamTest.java b/src/test/java/mc/protocol/io/NetOutputStreamTest.java index f63a7e8..6f843ee 100644 --- a/src/test/java/mc/protocol/io/NetOutputStreamTest.java +++ b/src/test/java/mc/protocol/io/NetOutputStreamTest.java @@ -1,5 +1,7 @@ package mc.protocol.io; +import mc.protocol.io.coder.ByteArrayNetInputStream; +import mc.protocol.io.coder.ByteArrayNetOutputStream; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test;